我正在尝试构建一个Netty Client,它可以与各种地址(或只是不同的端口)建立多个TCP连接。如果任何连接的通道关闭,我希望它能够在一段延迟时间后重新连接。以下是一些试图实现此目的的代码:
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来制定时间表?或者我还需要处理哪些其他选项?
提前致谢!
答案 0 :(得分:1)
创建您自己的ScheduledExecutorSevice并在那里安排工作。如果您只想测试它,那么为什么不尝试使用netty的GlobalEventExecutor来安排重新连接。