fireChannelRead() - 它的语义是什么?

fireChannelRead() - what is its semantic meaning?

在 Netty 中,当您想将控制移交给下一个处理程序时,您可以在处理程序中调用 ChannelHandlerContext.fireChannelRead()。这些文档的编写风格有点笨拙,有时很难获得预期的要点,这常常让我想知道一个方法应该做什么(即使在查阅了 Javadoc 之后)。对于这种方法,我特别想知道它应该指示什么样的事件。 Javadoc 说

A Channel received a message

从使用它的处理程序的角度来看,这确实没有意义。频道当然收到消息了;处理程序已经知道,既然已经收到了,那为什么要告诉上下文呢?这让我觉得调用这个方法有不同的含义,但是:

对我来说,用一个叫做 handlerFinishedRead() 之类的方法来通知上下文更有意义。然后fireChannelRead()被保留给管道调用。

我同意你的看法,fireChannelRead() 的命名可能不太理想。我认为考虑它的一个好方法是该方法在管道中的下一个 ChannelInboundHandler 上触发 channelRead() 方法。它有效地将消息传递给管道中的下一个 ChannelHandler。

查看 SimpleChannelInboundHandler 的源代码,您会发现它决定是否使用消息,然后调用 channelRead0 来处理它或 fireChannelRead() 不使用处理它,而是将它传递给管道中的下一个处理程序。 https://github.com/netty/netty/blob/deb34a0f8bf719b86aa68f9a242b94db78e9172b/transport/src/main/java/io/netty/channel/SimpleChannelInboundHandler.java#L92-L109

针对您列出的方法的可能含义,我会说它是另外一回事。它不一定是 “此处理程序已从通道读取(过去时)消息并已完成”,因为此处理程序可能不关心该消息。它也可能有与消息相关的排队工作,但没有与消息“完成”,我想这取决于你对完成的定义。我也不会将其描述为 “下一个处理程序可以随意读取来自通道的消息。” 因为我不认为这是一种同步机制。正在下一个处理程序上调用 channelRead 方法。