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 方法。
在 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 方法。