Netty Clientをビルドしようとしていますが、これはさまざまなアドレス(または異なるポート)への複数のTCP接続を行います。また、接続のチャンネルが閉じている場合、一定の遅延時間の後に再接続できるようにしたいと考えています。Netty4.1:スケジュールイベントによるSimpleChannelPoolの再接続
private ChannelPoolMap<InetSocketAddress, SimpleChannelPool> poolMap
= new AbstractChannelPoolMap<InetSocketAddress, SimpleChannelPool>() {
@Override
protected SimpleChannelPool newPool(InetSocketAddress key) {
return new SimpleChannelPool(
clientBootstrap.remoteAddress(key),
simpleChannelPoolHandler);
}
};
private void doConnect(InetSocketAddress address) {
final SimpleChannelPool pool = poolMap.get(address);
Future<Channel> f = pool.acquire();
f.addListener(
(FutureListener<Channel>) (Future<Channel> future) -> {
if(future.isSuccess()){
Channel ch = f.getNow();
ch.closeFuture().addListener(closeFuture -> {
log.info("closed: reconnecting");
doConnect(address);
});
pool.release(ch);
}else{
log.info("failed to connect, retry in 5 second");
Thread.sleep(5000);
doConnect(address);
}
});
}
public void remoteConnect() throws IOException, InterruptedException {
for (int i = 0; i < 100; i++) {
InetSocketAddress address = new InetSocketAddress("localhost", 8300 + i);
doConnect(address);
}
}
clientBootstrap
とsimpleChannelPoolHandler
ので、私はそれが必要でない限り、ここで示しつもりはありません、春Beanとして作成されます。ここではこれを実現しようとしているいくつかのコードがあります。
上記のように、再接続する前に遅延をシミュレートするためにThread.sleep(5000)
を使用しています。同じスレッド内の他の接続されたチャネルが新しいデータを受信するのをブロックするため、動作しません。
またch.eventLoop().schedule(..)
を使用しようとしましたが、再接続が失敗した場合(チャンネルがpool.acquire()
からヌルになるため)、NullPointerExceptionがスローされます。
スケジュールを作成するには、この状況からeventLoopを取得する必要がありますか?または、他にどのようなオプションを処理する必要がありますか?
ありがとうございます!
ありがとう! 'GlobalEventExecutor'を知らなかった。それのインスタンスを使用して再接続をスケジュールし、私が望むように動作しています。 – lok77chan