Netty ChannelInboundHandler.channelRead在连接之前被调用';s ChannelFutureListener.operationComplete

Netty ChannelInboundHandler.channelRead在连接之前被调用';s ChannelFutureListener.operationComplete,netty,Netty,我用netty编写了一个客户机-服务器应用程序,我最近注意到一个竞争条件,这是由于在connect的ChannelFutureListener.operationComplete之前调用了ChannelInboundHandler.channelRead 我的理解是,当客户端接受连接时,必须先调用connect的channelFutureListener,然后再处理来自套接字的第一条消息。我假设,通过在为负责从套接字读取数据的连接分配的相同I/O线程上执行connect的channelFutur

我用netty编写了一个客户机-服务器应用程序,我最近注意到一个竞争条件,这是由于在connect的ChannelFutureListener.operationComplete之前调用了ChannelInboundHandler.channelRead

我的理解是,当客户端接受连接时,必须先调用connect的channelFutureListener,然后再处理来自套接字的第一条消息。我假设,通过在为负责从套接字读取数据的连接分配的相同I/O线程上执行connect的channelFutureListener,可以保证排序

但我不确定为什么我没有看到netty的这种保证顺序,而是这两个事件要么并行执行,要么以相反的顺序执行


使用channelFutureListener的最佳实践是什么?是否有一种方法可以确保它在处理同一套接字的下一个事件之前执行?

您的理解是正确的。。。如果是这样的话,那就是一个bug。。。请在netty bug tracker中打开一个包含所有详细信息的问题(复制器将非常棒)。

谢谢Norman!在启用netty调试日志之后,我认为我们理解了这个问题。对netty的调用类似于:b.connect().addListener(…);连接似乎是在addListener完成之前建立的。是否有一种原子方法可以在连接请求之前请求连接到连接侦听器或设置侦听器,这样我可以保证连接侦听器始终是第一个被调用的侦听器?是的,有。。。您可以使用
bootstrap.register()
,然后使用
channel.connect(..)
ChannelPromise
作为参数。在这里,您可以在调用connect之前将侦听器添加到承诺中。