Netty 源码分析 09 ChannelHandler

本文深入分析Netty的ChannelHandler,包括ChannelOutboundHandlerAdapter、channelRegistered方法、checkMultiplicity、newContext、addLast0等关键流程。同时探讨了SimpleChannelInboundHandler、LoggingHandler、IdleStateHandler以及Timeout相关的异常处理。此外,还介绍了Netty的流量整形机制,如GlobalTrafficShapingHandler和ChannelTrafficShapingHandler的工作原理。
摘要由CSDN通过智能技术生成

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 抽象类,用于回调添

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值