【发布时间】:2012-10-05 13:06:53
【问题描述】:
我无法让 IdleStateHandler 在向服务器发送间隔“ping”时不超时。当执行器线程长时间忙于处理时会发生这种情况(对于同一通道)。
管道中的第一步是 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());
【问题讨论】: