public class HostBootstrap {
public HostBootstrap(String host, int port) {
this.host = host;
this.port = port;
bootstrap = new Bootstrap();
bossGroup = new NioEventLoopGroup();
}
public void connect() throws Exception {
try {
bootstrap.group(bossGroup)
.channel(NioSocketChannel.class)
.remoteAddress(new InetSocketAddress(host, port))
.handler(new HostChannelInitializer());
//async로 실행할 수 있는 방법이 있는지요???
ChannelFuture f = bootstrap.connect().sync();
clientChannel = f.channel().closeFuture().sync().channel();
} finally {
bossGroup.shutdownGracefully().sync();
}
}
}
synchronized static void createHostConnection(final int count)
{
try {
for (int i = 0; i < 5; i++) {
new HostBootstrap(Config.getHostIP(), Config.getHostPort()).connect();
}
} catch (Exception e) {
LOGGER.error("[HostChannelPool][createHostConnection]:{}", e.getMessage());
}
}
이렇게 실행할 경우, 1개만 연결이 됩니다. 아마도 bootstrap.connect().sync();
이부분이 sync로 되어 있어서, 저 곳에서 빠져 나오지 않는 듯 합니다.
저 부분을 빼면 연결이 되자 마자 접속을 끊어 버립니다.
접속이 종료되는 부분을 이벤트로 받는 방법은 없는것일까요??
결국 쓰레드로 여러개를 실행해서 해결하기는 했는데, 무조건 쓰레드로 해야되는것인지?
아니면, sync부분을 다른 방법으로 해결할 수 있는지 아시는 분은 답변 부탁드립니다.
//쓰레드로 여러개 실행한 코드
synchronized static void createHostConnection(final int count)
{
try {
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
new HostBootstrap(Config.getHostIP(), Config.getHostPort()).connect();
} catch (Exception e) {
LOGGER.error("createHostConnection {} {}", "onCriticalPoint", e.getMessage());
}
}
}).start();
Thread.sleep(100);
}
} catch (Exception e) {
LOGGER.error("[HostChannelPool][createHostConnection]:{}", e.getMessage());
}
}