2016-11-18 35 views
0

我正在嘗試構建一個Netty客戶端,它使得多個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創建爲的Spring bean,所以我不打算在這裏顯示,除非它是必要的。

如上所示,我使用Thread.sleep(5000)來模擬重新連接之前的延遲。它不工作,因爲它會阻止同一線程中的其他連接通道接收新數據。

我也嘗試使用ch.eventLoop().schedule(..),但如果重新連接失敗(因爲從pool.acquire()獲得的通道將爲空),則這樣做會拋出NullPointerException。

我應該如何從這種情況下獲得一個eventLoop來制定一個時間表?或者我還需要處理哪些其他選項?

在此先感謝!

回答

1

創建您自己的ScheduledExecutorSevice並安排那裏的工作。如果你只是想測試它,那麼你爲什麼不嘗試使用netty的GlobalEventExecutor來安排重新連接。

+0

非常感謝!沒有意識到'GlobalEventExecutor'。使用它的一個實例來安排重新連接,它按照我想要的方式工作。 – lok77chan