我在将间隔的“ ping”发送到服务器时,无法使IdleStateHandler不超时。当执行程序线程长时间忙于处理(对于同一通道)时,会发生这种情况。
管道的第一步是将超时设置为20秒的IdleStateHandler。
几步后,使用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());
最佳答案
ExecutionHandler不应影响IdleStateEvents的生成。您需要了解的是,如果在GameServerHandler中实现了处理IdleStateEvents的“逻辑”,则将取决于ExecutionHandler的繁忙程度(或更详细地说,由其使用的Executor)。
因此,我的建议是将IdleStateEvent的处理逻辑放在单独的IdleAwareUpstreamHandler实现中,并将其放在ExecutionHandler的前面,这样它将由IO-Thread处理,而不是通过ExecutionHandler处理。
关于java - 当执行程序线程繁忙时,Netty IdleStateHandler超时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12897648/