netty-channel-channelPipeline
ChannelPipeline
总体概念:
1、继续上篇文章,Channel 的所有的IO事件的结果封装类是 ChannelFuture ,产生结果后,同时会回
调 ChannelFutureListener
2、产生 ChannelFuture 的源头 定义在 Channel 接口, 具体处理事件的责任 全部 由 ChannelPipeline处理
3、ChannelPipeline 是一个链式结构,自然具有链表的基本功能,加入的对象是 ChannelHandlerContext
4、ChannelHandlerContext 顾名思义是对 ChannelHandler 的上下文环境的封装,
目的是:(1)方便 同一个ChannelPipeline 下,所有的ChannelHandler之间交流
(2)方便ChannelPipeline 与 ChannelHandler之间交流
5、 ChannelHandlerContext 处理 Channel IO 事件,根据不同的事件类型,会回调 ChannelHandler
一、Channel 的类图
(1)第一层:定义基本功能接口
(2)第二层:抽象层 , 半实现,新增加
a. 新建一个Channel时,就创建了ChannelPipeline
(3)第三层:针对不同的应用场景继续 抽象 或 实现 二
二、ChannelPipeline如何 处理 channel 的 事件的?
1、ChannelPipeline 的 创建
2、ChannelPipeline 链表增加 表面是增加 ChannelHandler, 实际封装后是 ChannelHandlerContext
(1) 两种增加方式:立刻增加,延迟增加(被其他事件发生时,回调增加)
(2)增加时,加锁控制 ,多个线程同时 向 同一个 Pipepline里增加Context
3、是 inBound 事件 还是 outBound 事件 ?
(1) ChannelFuture bind(SocketAddress ) 是 outBound 事件,会由 ChannelOutBoundHandler处理
调用线: ChannelPipeline =》ChannelHandlerContext => 具体的 ChannelHandler ,
处理事件后,
(1)ChannelPipeline 会回调 ChannelHandlerContext 的事件方法,告诉 handlers
(2)ChannelFuture 结果,会通知他所有的监听者