Netty中的ChannelPipeline和ChannelHandler机制类似于Servlet和Filter过滤器,这类拦截器实际上是责任链模式的一种变种,主要是为了方便事件的拦截和用户自定义逻辑的定义。
一、ChannelPipeline
(一)简单介绍
ChannelPipeline是ChannelHandler的容器,它负责ChannelHandler的管理和事件拦截与调度;
(二)事件处理
上图展示了一个消息被ChannelPipeline的ChannelHandler链拦截和处理的全过程 这个图是在ChannelPipeline里面截取出来的。
- 底层的SocketChannel.read()方法读取ByteBuf,触发ChannelRead方法,由I/O线程NioEventLoop调用ChannelPipeline的fireChannelRead(Object msg)方法,将消息传送到ChannelPipeline中;
- 消息依次被ChannelHandler1、ChannelHandler2、…等等进行拦截和处理,在这个过程中,任何ChannelHandler都可以中断流程来结束消息的传递;
- 写出消息,依次被这些ChannelHandler进行处理;
- 我们发现,读取信息的时候,触发的是InboundHandler,写数据的时候,触发的