在向服务器发送间隔“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());
答案 0 :(得分:0)
ExecutionHandler不应该影响IdleStateEvents的生成。您需要了解的是,如果您在GameServerHandler中实现了处理IdleStateEvents的“逻辑”,那么它将取决于您的ExecutionHandler的繁忙程度(或者更详细地说是它使用的Executor)。
所以我的建议是将IdleStateEvents的处理逻辑放在一个单独的IdleAwareUpstreamHandler实现中,并将它放在ExecutionHandler的前面,这样它将由IO-Thread处理,而不是通过ExecutionHandler处理。