在向服务器发送间隔的“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());