执行程序线程忙时,Netty IdleStateHandler超时

时间:2012-10-15 14:20:26

标签: java netty ping

在向服务器发送间隔“ping”时,我无法让IdleStateHandler没有超时。当执行程序线程忙于处理很长时间(对于相同的通道)时会发生这种情况。

管道的第一步是IdleStateHandler,超时设置为20秒。

几步之后,使用OrderedMemoryAwareThreadPoolExecutor设置管道,队列大小设置为3(maxChannelMemorySize)。

当从执行程序调度的工作线程处理很长时间(最多可能需要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());

1 个答案:

答案 0 :(得分:0)

ExecutionHandler不应该影响IdleStateEvents的生成。您需要了解的是,如果您在GameServerHandler中实现了处理IdleStateEvents的“逻辑”,那么它将取决于您的ExecutionHandler的繁忙程度(或者更详细地说是它使用的Executor)。

所以我的建议是将IdleStateEvents的处理逻辑放在一个单独的IdleAwareUpstreamHandler实现中,并将它放在ExecutionHandler的前面,这样它将由IO-Thread处理,而不是通过ExecutionHandler处理。