2016-11-18 5 views
0

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); 

    } 
} 

clientBootstrapsimpleChannelPoolHandlerので、私はそれが必要でない限り、ここで示しつもりはありません、春Beanとして作成されます。ここではこれを実現しようとしているいくつかのコードがあります。

上記のように、再接続する前に遅延をシミュレートするためにThread.sleep(5000)を使用しています。同じスレッド内の他の接続されたチャネルが新しいデータを受信するのをブロックするため、動作しません。

またch.eventLoop().schedule(..)を使用しようとしましたが、再接続が失敗した場合(チャンネルがpool.acquire()からヌルになるため)、NullPointerExceptionがスローされます。

スケジュールを作成するには、この状況からeventLoopを取得する必要がありますか?または、他にどのようなオプションを処理する必要がありますか?

ありがとうございます!

答えて

1

独自のScheduledExecutorSeviceを作成し、そこでの作業をスケジュールします。テストしたいだけなら、nettyのGlobalEventExecutorを使って再接続をスケジュールしてみてください。

+0

ありがとう! 'GlobalEventExecutor'を知らなかった。それのインスタンスを使用して再接続をスケジュールし、私が望むように動作しています。 – lok77chan

関連する問題