ChannelPipeline不是单独存在,它肯定会和Channel、ChannelHandler、ChannelHandlerContext关联在一起。
上图↓
ChannelInboundHandler(入站): 处理输入数据和Channel状态类型改变。
适配器: ChannelInboundHandlerAdapter(适配器设计模式)
常用的: SimpleChannelInboundHandler(会对没有外界引用的资源进行一定的清理,
并且入站的消息可以通过泛型来规定)
ChannelOutboundHandler(出站): 处理输出数据
适配器: ChannelOutboundHandlerAdapter
ChannelHandler 生命周期
handlerAdded: 当 ChannelHandler 添加到 ChannelPipeline 调用
handlerRemoved: 当 ChannelHandler 从 ChannelPipeline 移除时调用
exceptionCaught: 当 ChannelPipeline 执行抛出异常时调用
关于ChannelPipeline上图↓
1-ChannelPipeline类是ChannelHandler实例对象的链表,用于处理或截获通道的接收和发送数据
2-ChannelPipeline类它提供了一种高级的截取过滤模式(类似serverlet中的filter功能),让用户可以ChannelPipeline中完全控制一个事件以及如何处理ChannelHandler与ChannelPipeline的交互
3-每个新的通道Channel,都会创建一个新的ChannelPipeline,并将器pipeline附加到channel中
常用方法如下↓
addFirst(...) //添加ChannelHandler在ChannelPipeline的第一个位置
addBefore(...) //在ChannelPipeline中指定的ChannelHandler名称之前添加ChannelHandler
addAfter(...) //在ChannelPipeline中指定的ChannelHandler名称之后添加ChannelHandler
addLast(...) //在ChannelPipeline的末尾添加ChannelHandler
remove(...) //删除ChannelPipeline中指定的ChannelHandler
replace(...) //替换ChannelPipeline中指定的ChannelHandler
入站出战的顺序
ch.pipeline().addLast(new InboundHandler1());
ch.pipeline().addLast(new OutboundHandler1());
ch.pipeline().addLast(new OutboundHandler2());
ch.pipeline().addLast(new InboundHandler2());
或者:
ch.pipeline().addLast(new OutboundHandler1());
ch.pipeline().addLast(new OutboundHandler2());
ch.pipeline().addLast(new InboundHandler1());
ch.pipeline().addLast(new InboundHandler2());
不管什么顺序添加,执行顺序如下↓
InboundHandler1--> InboundHandler2 -->OutboundHandler2 -->OutboundHandler1
总结如下↓
1-InboundHandler顺序执行,OutboundHandler逆序执行
2-InboundHandler之间传递数据,通过ctx.fireChannelRead(msg)
3-InboundHandler通过ctx.write(msg),则会传递到outboundHandler
4-使用ctx.write(msg)传递消息,Inbound需要放在结尾,在Outbound之后,不然outboundhandler会不执行;但是使用channel.write(msg)、pipline.write(msg)情况会不一致,都会执行,那是因为channel和pipline会贯穿整个流。
来个图↓
ChannelPipeline并不是直接管理ChannelHandler,而是通过ChannelHandlerContext来间接管理
Pipeline的事件传播,是靠Pipeline,Context和Handler共同协作完成的