2013-11-02 53 views
7
關閉

簡單的場景:什麼是最好的方式來重新連接後Netty中

  1. 延伸SimpleChannelUpstreamHandler一個較低的水平A級。這個班是發送消息並收到答覆的主力。
  2. 系統其他部分可以用來發送和接收消息的頂級B類(可以模擬同步和異步)。這個類創建ClientBootstrap,設置管道工廠,調用bootstrap.connect()並最終獲得類A的句柄/引用,通過該句柄來引發和接收消息。例如:

    ChannelFuture future = bootstrap.connect(); 
    Channel channel = future.awaitUninterruptibly().getChannel(); 
    

    handler = channel.getPipeline()。get(A.class);

我知道A類,我可以覆蓋 公共無效channelClosed(ChannelHandlerContext CTX,ChannelStateEvent E); ,這樣當遠程服務器關閉時,我可以收到通知。

由於通道關閉後,類B中的原始類A引用(處理程序上面)無效,因此我需要用新引用替換它。

理想情況下,我希望類A有一個機制在上面覆蓋的channelClosed方法內通知類B,以便可以在類B中再次調用bootstrap.connect。一種方法是在類A中引用該參考類B.爲此,我需要將B類參考傳遞給PipelineFactory,然後讓PipelineFactory將B的參考傳遞給A.

任何其他更簡單的方法來實現相同的事情?

感謝,

回答

14

Channel.closeFuture()返回ChannelFuture當通道被關閉,將通知您。您可以在B中爲未來添加ChannelFutureListener,以便您可以在此嘗試另一次連接。

你可能想重複這一點,直到連接嘗試成功,終於:

private void doConnect() { 
    Bootstrap b = ...; 
    b.connect().addListener((ChannelFuture f) -> { 
     if (!f.isSuccess()) { 
      long nextRetryDelay = nextRetryDelay(...); 
      f.channel().eventLoop().schedule(nextRetryDelay, ...,() -> { 
       doConnect(); 
      }); // or you can give up at some point by just doing nothing. 
     } 
    }); 
} 
+1

正常工作對我來說,只是當我使用NioEventLoopGroup超過1個線程。每個計劃都會創建一個新的工作線程(達到我池中的最大值),而舊的工作線程不會被處理,爲什麼? –

相關問題