在向服务器发送间隔“ping”时,我无法让 IdleStateHandler 不超时。当执行器线程长时间忙于处理(对于同一 channel )时,就会发生这种情况。
管道中的第一步是超时设置为 20 秒的 IdleStateHandler。
几个步骤后,使用 OrderedMemoryAwareThreadPoolExecutor 设置管道,并将小队列大小设置为 3 (maxChannelMemorySize)。
当从执行器分派(dispatch)的工作线程处理很长时间(可能需要长达 90 秒)时,IdelStateHandler 似乎只能接收 3 条消息(messageReceived)。将执行器中的队列大小更改为 30 将允许 IdleStateHandler 中进行 30 个 messageReceived 调用。然后又在 20 秒后超时。 ChannelIdle 在 GameServerHandler 中实现(最后一步)。
我对 Netty 还很陌生,所以很可能我还没有理解管道的一些概念——我的期望是消息总是在层之间传递。我希望为每个传入消息调用 IdleStateHandle,无论执行程序的队列大小如何,因为它是稍后添加的。
我使用的是 netty 3.5.8 Final。
我错过了什么?
OrderedMemoryAwareThreadPoolExecutor eventExecutor = new OrderedMemoryAwareThreadPoolExecutor(100, 3, 300);
Timer timer = new HashedWheelTimer();
...
pipeline.addLast("idleHandler", new IdleStateHandler(timer, 20, 0, 0));
...
pipeline.addLast("executionHandler", executionHandler);
pipeline.addLast("handler", new GameServerHandler());
最佳答案
ExecutionHandler 不应影响 IdleStateEvents 的生成。您需要了解的是,如果您处理 IdleStateEvents 的“逻辑”是在 GameServerHandler 中实现的,那么它将取决于您的 ExecutionHandler 的繁忙程度(或者更详细地讲,它所使用的 Executor)。
所以我的建议是将 IdleStateEvents 的处理逻辑放在单独的 IdleAwareUpstreamHandler 实现中,并将其放在 ExecutionHandler 前面,这样它将由 IO-Thread 处理,而不是通过 ExecutionHandler。
关于java - 当执行器线程繁忙时 Netty IdleStateHandler 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12897648/