2016-04-04 83 views
1

我有一個場景,我使用netty NIO建立TCP連接,假設服務器發生故障,當它再次出現時如何自動連接到服務器? 或者有任何方法可以在服務器上附加可用性監聽器嗎?如何在netty中斷開連接後自動連接到TCP服務器

+0

有趣的問題,但我認爲這是可能的只是做一個ping到服務器,以獲得可用性 – HCarrasko

+0

但在這種情況下,我需要保持我的線程忙於檢查服務器的可用性,讓我們看看是否有人有任何想法 – Kaku

+0

嘗試在處理程序中使用ChannelInactive方法 – Ferrybig

回答

2

您可以讓DisconnectionHandler作爲客戶端管道上的第一件事情,它通過立即嘗試重新連接或調度重新連接任務來對channelInactive做出反應。

例如,

public class DisconnectionHandler extends ChannelInboundHandlerAdapter { 

    @Override 
    public void channelInactive(final ChannelHandlerContext ctx) throws Exception { 

    Channel channel = ctx.channel(); 

    /* If shutdown is on going, ignore */ 
    if (channel.eventLoop().isShuttingDown()) return; 

    ReconnectionTask reconnect = new ReconnectionTask(channel); 
    reconnect.run(); 
    } 

} 

ReconnectionTask會是這樣的:

public class ReconnectionTask extends Runnable, ChannelFutureListener { 

    Channel previous; 

    public ReconnectionTask(Channel c) { 
     this.previous = c; 
    } 

    @Override 
    public void run() { 
     Bootstrap b = createBootstrap(); 
     b.remoteAddress(previous.remoteAddress()) 
      .connect() 
      .addListener(this); 
    } 

    @Override 
    public void operationComplete(ChannelFuture future) throws Exception { 
     if (!future.isSuccess()) { 
      // Will try to connect again in 100 ms. 
      // Here you should probably use exponential backoff or some sort of randomization to define the retry period. 
      previous.eventLoop() 
        .schedule(this, 100, MILLISECONDS); 
      return; 
     } 
     // Do something else when success if needed. 
    } 
} 

檢查這裏的Exponential Backoff library一個例子。

+0

感謝Leo,它是有道理的,你知道netty中是否有任何基礎功能,它給了我相同的功能,任何連接設置選項? – Kaku

+0

不是我所知道的。我會想到ChannelPool(http://netty.io/4.0/api/index.html?io/netty/channel/pool/package-summary.html)實現中的一些東西,但它似乎不是案件。 –

相關問題