我有一個場景,我使用netty NIO建立TCP連接,假設服務器發生故障,當它再次出現時如何自動連接到服務器? 或者有任何方法可以在服務器上附加可用性監聽器嗎?如何在netty中斷開連接後自動連接到TCP服務器
1
A
回答
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)實現中的一些東西,但它似乎不是案件。 –
相關問題
- 1. Android tcp客戶端連接,然後從java服務器斷開連接
- 2. 如何連接/斷開服務器?
- 3. TCP連接斷開檢測(如果中間連接斷開)?
- 4. 如何設置MySQL Workbench自動從服務器斷開連接?
- 5. 客戶端在連接到節點js後立即斷開TCP服務器
- 6. 確定TCP服務器中的斷開連接
- 7. 如何在文件下載後斷開FTP服務器連接?
- 8. 強制斷開TCP連接
- 9. 服務器在客戶端斷開連接後收到消息
- 10. 保持TCP連接打開,直到斷開連接Android
- 11. Android服務器啓動的TCP連接
- 12. 如何在連接中斷後自動重新連接Oracle連接池?
- 13. boost :: asio tcp服務器斷開連接問題
- 14. 連接到扭曲的TCP服務器
- 15. Javascript到服務器的TCP連接
- 16. 如何連接 - 斷開 - 重新連接到Neo4j服務器實例
- 17. 硬件斷開連接後的TCP恢復連接
- 18. psycopg2與服務器斷開連接
- 19. SQL服務器定期斷開連接
- 20. Linux的TCP服務器:接受連接
- 21. 如何在Netty中打開TCP連接(客戶端)?
- 22. 無法連接到tcp服務器超過140個連接?
- 23. 在Delphi中檢測TCP連接/斷開連接
- 24. 用於很多長期TCP連接的Netty服務器
- 25. 用於服務器到服務器連接的單個持久性TCP連接
- 26. 自動連接到SFTP服務器(FileZilla)
- 27. 如何在服務器端捕獲客戶端的連接和斷開連接?
- 28. Netty服務器遠程連接
- 29. Tcp服務器在一定時間後不接受連接
- 30. KryoNet:連接後立即斷開連接
有趣的問題,但我認爲這是可能的只是做一個ping到服務器,以獲得可用性 – HCarrasko
但在這種情況下,我需要保持我的線程忙於檢查服務器的可用性,讓我們看看是否有人有任何想法 – Kaku
嘗試在處理程序中使用ChannelInactive方法 – Ferrybig