Netty中ChannelHandler和Pipeline的执行机制
解释Netty中ChannelPipeline、ChannelHandler和ChannelHandlerContext三者的关系,以及inbound/outbound事件在Pipeline中的传播机制和异常处理链路。
回答
小字辈
Netty的Pipeline设计采用了责任链模式:
1. 核心组件关系
- ChannelPipeline:ChannelHandler的容器链表,内部维护了head→...→tail的双向链表
- ChannelHandler:业务逻辑处理器,分为ChannelInboundHandler和ChannelOutboundHandler
- ChannelHandlerContext:Handler与Pipeline关联的上下文,包含Channel、Pipeline引用,可动态添加/删除Handler
2. 事件传播机制
- Inbound事件(read/active/inactive/exceptionCaught):从head开始→正向传播到tail
ctx.fireChannelRead(msg)将事件传递给下一个InboundHandler- 继承SimpleChannelInboundHandler会在处理完自动释放ByteBuf
- Outbound事件(write/connect/bind/flush/close):从tail开始→反向传播到head
ctx.write(msg)从当前Handler向前一个OutboundHandler传播ctx.channel().write(msg)从tail开始传播到head
3. 异常处理
- 异常沿Inbound方向传播
- 通常在Pipeline末尾添加
exceptionCaught统一处理 - 未捕获的异常会到达tail handler并被记录日志
4. 动态编排
pipeline.addLast("编码器", new StringEncoder());
pipeline.addFirst("解码器", new StringDecoder());
pipeline.replace("旧Handler", "新Handler", new CustomHandler());
pipeline.remove("某个Handler");