This commit is contained in:
crusader 2017-12-19 15:28:34 +09:00
parent f578e72c43
commit d6a7dc0670
3 changed files with 75 additions and 25 deletions

2
.vscode/launch.json vendored
View File

@ -13,7 +13,7 @@
"stopOnEntry": false,
"mainClass": "com.loafle.overflow.probe.container.Container",
"projectName": "probe_container_general",
"args": ""
"args": "/project/overFlow/probe/pid/general.pid"
},
{
"type": "java",

View File

@ -5,8 +5,13 @@ import com.loafle.overflow.probe.container.server.ContainerServer;
public class Container {
public static void main(String[] args) throws Exception {
ContainerServer server = new ContainerServer();
if(args.length <= 0) {
System.out.println("first parameter is path of pid file");
return;
}
String pidPath = args[0];
server.start();
ContainerServer server = new ContainerServer();
server.start(pidPath);
}
}

View File

@ -5,35 +5,80 @@ import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import java.net.InetSocketAddress;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class ContainerServer {
private int port = 19390;
private int port;
public ContainerServer() {
}
public ContainerServer() {
}
public void start() throws Exception {
InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port);
public void start(String pidPath) throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup(10);
try {
ServerBootstrap b = new ServerBootstrap();
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup(10);
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(ContainerConfiguration.channelInitializer())
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);
ChannelFuture f = null;
for (int i = 60000; i < 61000; i++) {
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(ContainerConfiguration.channelInitializer())
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);
ChannelFuture f = b.bind(socketAddress).sync();
f.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
f = b.bind("127.0.0.1", i).sync();
this.port = i;
break;
} catch (Exception e) {
System.out.println(e);
continue;
}
}
if (null == f) {
System.out.println("There is not available port");
return;
}
try {
FileOutputStream outputStream = new FileOutputStream(pidPath);
outputStream.write(Integer.toString(this.port).getBytes());
outputStream.close();
} catch (IOException e) {
System.out.println(e);
return;
}
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
ContainerServer.onStop(pidPath);
}
});
f.channel().closeFuture().sync();
} finally {
onStop(pidPath);
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
private static void onStop(String pidPath) {
try {
File f = new File(pidPath);
f.delete();
} catch (Exception e) {
System.out.println(e);
}
}
}