1

我在使用 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);
4

0 回答 0