1

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

1 回答 1

0

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

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

于 2012-10-16T04:50:49.827 回答