Netty:断开连接/重新连接时失速

时间:2013-09-06 15:37:26

标签: java tcp netty

我在使用Netty(3.6.6)时遇到了一些奇怪的行为:

我构建了一个简单的客户端 - 服务器架构,客户端通过Netty通过TCP连接到服务器。客户端包括重新建立连接的逻辑,如果它断开连接,后退并无限期重试。

问题:如果我强行断开客户端多次,它会到达重新连接尝试开始失败的程度。他们继续失败了许多连接尝试,持续几分钟然后恢复工作(!)。

其他一些观点:

  • 导致失败所需的断开连接数对应于工作池中的线程数;例如对于单线程工作池,我只需要断开客户端一次以解决问题。对于包含8个线程的线程池,我需要执行8次断开连接以解决问题。
  • 一旦处于“失败状态”,恢复期越短,我在工作池中的线程就越多。此外,当处于故障状态时,所有工作线程似乎都在内部选择器上被阻止。
  • 调试时我注意到connect()尝试失败时Channel已打开但未连接。

有没有人遇到过这个问题?

初始化代码(执行一次)

    Executor bossPool = Executors.newSingleThreadExecutor(new SimpleThreadFactory("I/O Boss Thread"));
    Executor workerPool = Executors.newSingleThreadExecutor();
    ChannelFactory channelFactory = new NioClientSocketChannelFactory(bossPool, workerPool);

    bootstrap = new ClientBootstrap(channelFactory);

连接代码(在重新连接尝试时执行)

    // SimpleChannelHandler responsible for establishing which protocol we're speaking.
    SalutationHandler salutationHandler = new SalutationHandler(messageCodec);

    // Reconfigure pipeline to initial state.
    // Will be reconfigured again after initial client-server handshaking.
    bootstrap.setPipeline(configureNewPipeline(Channels.pipeline(salutationHandler)));

    // Wait for up to 5 seconds before timing out.
    wrapChannelFuture(bootstrap.connect(address)).sync(timeOutMillis, TimeUnit.MILLISECONDS);

0 个答案:

没有答案