摘要:
netty 源码版本
io.netty:netty-all:4.1.32.Final
Channel、ChannelPipeline、ChannelHandlerContext、ChannelHandler
Channel
AbstractChannel
1 | public abstract class AbstractChannel extends DefaultAttributeMap implements Channel { |
ChannelPipeline
ChannelHandlerContext
ChannelHandler
Handles an I/O event or intercepts an I/O operation, and forwards it to its next handler in its ChannelPipeline.
Channel-Pipeline-Context-Handler 关系
Channel 和 ChannelPipeline 是一对一的关联关系,而 ChannelPipeline 内部的多个 ChannelHandlerContext 形成了双向链表(链表的头是 HeadContext, 链表的尾是 TailContext),Context 只是对 ChannelHandler 的封装。
Servlet 的 Filter
Spring MVC 的 Intercepter
ChannelPipeline 添加 ChannelHandler
示例
1 | ch.pipeline() |
DefaultChannelPipeline#addLast
1 |
|
我们知道 AbstractChannelHandlerContext 中有 inbound 和 outbound 两个 boolean 变量, 分别用于标识 Context 所对应的 handler 的类型, 即:
inbound 为真时, 表示对应的 ChannelHandler 实现了 ChannelInboundHandler 方法.
outbound 为真时, 表示对应的 ChannelHandler 实现了 ChannelOutboundHandler 方法.
注意, 如果我们捕获了一个事件, 并且想让这个事件继续传递下去, 那么需要调用 Context 相应的传播方法.
pipeline 中的 inbound 事件传播
1 | // DefaultChannelPipeline#fireChannelActive |
同理,可以分析所有 inbound 事件的传播,正常情况下,即用户如果不覆盖每个节点的事件传播操作,所有 inbound 事件最后都落到 Tail 节点上。
pipeline 中的 outbound 事件传播
参考
本文参考了互联网上大家的分享,就不一一列举,在此一并谢过。
也希望本文,能对大家有所帮助,若有错误,还请谅解、指正。