我正在嘗試構建一個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);
}
}
clientBootstrap
和simpleChannelPoolHandler
創建爲的Spring bean,所以我不打算在這裏顯示,除非它是必要的。
如上所示,我使用Thread.sleep(5000)
來模擬重新連接之前的延遲。它不工作,因爲它會阻止同一線程中的其他連接通道接收新數據。
我也嘗試使用ch.eventLoop().schedule(..)
,但如果重新連接失敗(因爲從pool.acquire()
獲得的通道將爲空),則這樣做會拋出NullPointerException。
我應該如何從這種情況下獲得一個eventLoop來制定一個時間表?或者我還需要處理哪些其他選項?
在此先感謝!
非常感謝!沒有意識到'GlobalEventExecutor'。使用它的一個實例來安排重新連接,它按照我想要的方式工作。 – lok77chan