创建时间:
PipeLine在Channel被创建的时候创建<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/21405095/1650374884593-51ec54bd-0c48-4424-bec8-71234f41c1c0.png#clientId=u02e834e1-bbb3-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=929&id=u73362724&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1394&originWidth=2560&originalType=binary&ratio=1&rotation=0&showTitle=false&size=411767&status=done&style=stroke&taskId=ud6866703-f183-41fe-ad54-fbb9cdb08a4&title=&width=1706.6666666666667)
节点数据结构 ChannelHandlerContext:
ChannelInboundInvoker 用于读事件、注册事件(Active事件),说明 ChannelHandlerContext 都有传播读事件的功能,同理可得继承 ChannelOutboundInvoker 说明 ChannelHandlerContext 具有传播写事件的功能
Channel channel(); 说明 PipeLine 的每个节点都要了解当前节点属于哪个 Channel
EventExecutor executor(); 说明哪个 EventLoop 最终执行到该节点
String name(); 意为节点处理器名称
ChannelHandler handler(); 意为业务逻辑处理器(节点处理器),PipeLine 的每个节点都会包含一个节点处理器和节点处理器名称
boolean isRemoved(); 用于判断当前节点是否被移除
ChannelPipeline pipeline(); 可得当前节点的PipeLine是哪一个
ByteBufAllocator alloc(); 可以得知当前节点上如有数据读写,当需要分配 ByteBuf 时使用哪个内存分配器
默认情况下 ChannelHandlerContext 由 AbstractChannelHandlerContext 进行实现
添加ChannelHandler:
从服务端的 pipeline.addLast 进行源码追踪,查看 ChannelHandler 的添加流程
如果 checkMultiplicity() 校验成功,返回 ChannelHandlerContext 节点将 ChannelHandler 包装进去,然后将节点以链表的形式添加到 PipeLine,最终回调添加完成事件
h.added 判断当前Handler有没有被添加过,isSharable() 判断有无 Sharable 注解
返回服务端代码,查看 ChannelInitializer 源码,发现再其自身被添加完成之后,会调用 initChannel 方法,调用完毕后会进行自身删除,最终效果就是 PipeLine 添加了自定义 Handler,这个是最典型的回调事件
移除ChannelHandler:
最常见的场景为在 pipeline.addLast 内添加权限验证处理器
权限验证处理器使用案例
追溯源码,先查看其 getContextOrDie 方法, getContextOrDie 内的 context 方法会通过遍历链表的方式获取当前 channelhandler 对应的 channelHandlerContext 节点
返回到 remove 方法,其 atomicRemoveFromHandlerList 方法通过双向链表的删除方式将当前节点从链表中删除,最后执行 callHandlerRemoved0 方法回调删除handler事件