java - 当执行器线程繁忙时 Netty IdleStateHandler 超时

标签 java netty ping

在向服务器发送间隔“ping”时,我无法让 IdleStateHandler 不超时。当执行器线程长时间忙于处理(对于同一 channel )时,就会发生这种情况。

管道中的第一步是超时设置为 20 秒的 IdleStateHandler。

几个步骤后,使用 OrderedMemoryAwareThreadPoolExecutor 设置管道,并将小队列大小设置为 3 (maxChannelMemorySize)。

当从执行器分派(dispatch)的工作线程处理很长时间(可能需要长达 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 的生成。您需要了解的是,如果您处理 IdleStateEvents 的“逻辑”是在 GameServerHandler 中实现的,那么它将取决于您的 ExecutionHandler 的繁忙程度(或者更详细地讲,它所使用的 Executor)。

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

关于java - 当执行器线程繁忙时 Netty IdleStateHandler 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12897648/

相关文章:

java - java中字符串相乘的方法

java - 从 Google Cloud BigQuery 读取数据

java - 如何在 ANTLR 中分离出 block 的开始和结束标记

java - 每个 UDP 数据报的 Netty 不同管道

netty - 由于缺少 PSH 标志,AWS 的代理协议(protocol) v2 中断应用程序

java - 什么时候规范不是规范 - 全能的 RPC 博客 ping 规范难题

java - Java 中的设计模式问题

java - RxNetty 重用连接

Java 错误未报告的异常 IOException;必须被捕获或宣布被抛出

c - 如何检查给定的IP地址是否可以在C程序中访问