Netty4.1:SimpleChannelPool与schedule事件重新连接

时间:2016-11-18 02:33:44

标签: netty

我正在尝试构建一个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);

    }
}

clientBootstrapsimpleChannelPoolHandler被创建为Spring bean,因此除非有必要,否则我不会在此处显示。

如上所示,我在重新连接之前使用Thread.sleep(5000)来模拟延迟。它无法正常工作,因为它会阻止同一线程中的其他连接通道接收新数据。

我也尝试使用ch.eventLoop().schedule(..),但如果重新连接失败(因为从pool.acquire()获取的通道为空),这样做会抛出NullPointerException。

如何从这种情况中获取eventLoop来制定时间表?或者我还需要处理哪些其他选项?

提前致谢!

1 个答案:

答案 0 :(得分:1)

创建您自己的ScheduledExecutorSevice并在那里安排工作。如果您只想测试它,那么为什么不尝试使用netty的GlobalEventExecutor来安排重新连接。