Java Netty偶尔会将消息按顺序写入同一频道

Java Netty偶尔会将消息按顺序写入同一频道,java,netty,Java,Netty,我们正在开发一个相当简单的Netty服务器应用程序。管道包含WriteTimeoutHandler和上下文处理程序。所有写入都使用非netty线程执行。当从一个线程向客户机写入多条消息时,我们偶尔会看到消息被无序传递。我们在netty代码中添加了一些stdout调试,当错误发生时,似乎已经达到某种形式的超时,因为WriteTimeoutHandler任务被添加到事件队列中,并且相关消息被重新提交到队列中。在高层次上,似乎正在发生的是: 书面繁体(A) 添加了一个事件 书面繁体(B) 为B添加事

我们正在开发一个相当简单的Netty服务器应用程序。管道包含WriteTimeoutHandler和上下文处理程序。所有写入都使用非netty线程执行。当从一个线程向客户机写入多条消息时,我们偶尔会看到消息被无序传递。我们在netty代码中添加了一些stdout调试,当错误发生时,似乎已经达到某种形式的超时,因为
WriteTimeoutHandler
任务被添加到事件队列中,并且相关消息被重新提交到队列中。在高层次上,似乎正在发生的是:

  • 书面繁体(A)
  • 添加了一个事件
  • 书面繁体(B)
  • 为B添加事件
  • Netty试图写一篇文章,但“不好的事情”发生了,似乎A被重新安排了
  • 内蒂写B
  • 内蒂写了一篇文章
如前所述,我们看到在问题发生时添加了一个
WriteTimeoutHandler
,但是,由于这些事件都发生在毫秒内,因此不应达到超时(设置为10秒)。(我们正在运行的代码是所有在本地执行的测试代码)。同样令人困惑的是,超时处理程序被记录为产生一个可以在我们自己的代码中处理的异常,但是我们从来没有看到这个异常从netty冒出来

看看其他问题,netty的承诺似乎是,如果

您正在从EventLoop线程执行所有写入操作;或 您没有从EventLoop线程执行任何写入操作(即,所有写入操作都是在其他>线程中执行的)

我相信我们正在完成这个合同,所以不确定会发生什么

谢谢

网络版:4.1.52 Java:1.8