我在jdk1.6_20
上使用Linux 2.6
。我正在观察一种行为,在调用Selector.select(timeout)
之后,NIO Selector无法在超时(timeout=5 sec
)内唤醒。它返回很晚,几秒钟延迟(2~10秒)。这似乎在应用程序启动时间的最初几分钟内经常发生,并在以后稳定下来。由于我们的服务器与客户端心跳加速,因此选择器未能按时唤醒会导致心跳错过,并且对等方断开连接。
任何帮助表示赞赏。感谢。
答案 0 :(得分:2)
来自Selector.select(long)
的Javadoc:
这种方法不提供实时保证:它安排了 超时就好像通过调用Object.wait(long)方法一样。
由于应用程序的启动时间可能会对系统造成很大压力,这可能会导致唤醒延迟。
对于解决方案:切换到Selector.selectNow()
作为非阻塞操作并处理应用程序代码中的重试。
答案 1 :(得分:0)
timeout
是什么并不重要,一旦客户端连接,选择器应立即唤醒。因此,你有一些更严重的错误。
答案 2 :(得分:0)
无法在超时内唤醒(超时= 5秒)。
它不应该'在超时内唤醒'。它应该在超时到期后唤醒。如果您应该在5秒内发送心跳,则5秒的超时时间太长。在这种情况下,我会把它设为2.5秒。
答案 3 :(得分:0)