Netty的深入浅出--56.ChannelPipeline创建时机与高级拦截器模式的运用

 这一章我们继续深入分析ChannelPipeline

我们可以看到AbstractChannel是channel的一个抽象实现

我们现在可以理解所有继承于 AbstractChannel的channel对象,其内部都是有一个pipeline管道变量

 创建pipeline

 

我们发现pipeline到最后创建出来的时候竟然是一个channel对象。震惊!(ΩДΩ) 

接下来我们要分析tail、head 

 

其实AbstractChannelHandlerContext 继承的是ChannelHandlerContext;(这个后面再进行深入分析)

 

 

 然后头尾相连

 

我们继续分析ChannelPipeline

它是一组channelHandler,用来处理和拦截入栈和出栈操作的channel,它实现了一个优先的拦截过滤器模式让使用者能够控制事件和pipeline里面HannelHandler的彼此之间的交互。

这里有一个非常重要的知识点:

过滤器模式:

传统的过滤器模式是客户端发送请求给服务端,假设要依次经过A、B、C三个处理器,处理完之后返回给客户端的时候,依次经过C、B、A三个过滤器

netty的过滤器模式是客户端发送请求给服务端,那么它就只经过A、B、C这些处理请求的过滤器;而服务端响应给客户端的由D、E、F这些处理响应的过滤器来处理。

pipeline会在channel创建的时候自动创建,每一个channel会拥有它自己的pipeline。

 

pipeline只是一个容器,真正处理请求的是它里面一系列的channelHandler;

这里提到一点:channelHandler处理完之后会交给下一个最近channelHandler,而如何确定下一个最近的channelHandler是通过ChannelHandlerContext来决定的。

 

入栈处理器还出栈处理器或者既是入栈也是出栈处理器 通过你new的对象来决定

 

这里有一个很重要知识点:

因为在pipeline中进行channelhander处理的时候是要通过一个个处理器来排队进行处理的,但是这样也会出现一个问题,如果一个处理很长的话,那很有可能就会出现长时间的阻塞,所以官方提出来的一个解决办法就是创建线程池来讲处理事件单独提取出来放入到线程中处理。和当前pipeline的主线程不会构成影响。

 

 

猜你喜欢

转载自blog.csdn.net/qq_37909508/article/details/91475331