ChannelHandler(一)
@Sharable
注解,ChannelHandler 是否可共享,即是否可以被多次添加
ChannelInitializer ,一个特殊的 ChannelHandler ,用于 Channel 注册到 EventLoop 后,执行自定义的初始化操作。一般情况下,初始化自定义的 ChannelHandler 到 Channel 中
- 对于
#handlerAdded(ChannelHandlerContext ctx)
和#handlerRemoved(ChannelHandlerContext ctx)
方法,默认无任何逻辑。子类如果有自定义的逻辑,可以进行覆写对应的方法。 #exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
方法,直接转发到下一个节点
4. ChannelOutboundHandlerAdapter
io.netty.channel.ChannelOutboundHandlerAdapter
,实现 ChannelOutboundHandler 接口,继承 ChannelHandlerAdapter 抽象类
每个实现方法,直接转发到下一个节点,实际上也是默认无任何逻辑。子类如果有自定义的逻辑,可以进行覆写对应的方法
大多数情况下,我们会实现 ChannelDuplexHandler 类,覆写部分方法,处理对应的事件。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ChannelHandler(二)之 ChannelInitializer
们来分享 ChannelInitializer 。它是一个特殊的ChannelInboundHandler 实现类,用于 Channel 注册到 EventLoop 后,执行自定义的初始化操作。一般情况下,初始化自定义的 ChannelHandler 到 Channel 中
在有新连接接入时,服务端通过 ChannelInitializer 初始化,为客户端的 Channel 添加自定义的 ChannelHandler ,用于处理该 Channel 的读写( read/write ) 事件
2.2 channelRegistered
在 Channel 注册到 EventLoop 上后,会触发 Channel Registered 事件。那么 ChannelInitializer
的 #channelRegistered(ChannelHandlerContext ctx)
方法,就会处理该事件
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3. checkMultiplicity
#checkMultiplicity(ChannelHandler handler)
方法,校验是否重复的 ChannelHandler
5. newContext
#newContext(EventExecutorGroup group, String name, ChannelHandler handler)
方法,创建 DefaultChannelHandlerContext 节点。而这个节点,内嵌传入的 ChannelHandler 参数
6. addLast0
#addLast0(AbstractChannelHandlerContext newCtx)
方法,添加到最后一个节点。注意,实际上,是添加到 tail
节点之前
7. callHandlerAdded0
#callHandlerAdded0(AbstractChannelHandlerContext)
方法,执行回调 ChannelHandler 添加完成( added )事件
8. PendingHandlerCallback
PendingHandlerCallback ,实现 Runnable 接口,等待添加 ChannelHandler 回调抽象类
为什么会有 PendingHandlerCallback 呢?
因为 ChannelHandler 添加到 pipeline 中,会触发 ChannelHandler 的添加完成( added )事件,并且该事件需要在 Channel 所属的 EventLoop 中执行。
但是 Channel 并未注册在 EventLoop 上时,需要暂时将“触发 ChannelHandler 的添加完成( added )事件”的逻辑,作为一个 PendingHandlerCallback 进行“缓存”。在 Channel 注册到 EventLoop 上时,进行回调执行。
8.1 PendingHandlerAddedTask
PendingHandlerAddedTask 实现 PendingHandlerCallback 抽象类,用于回调添