netty(五)--ChannelHandler和ChannelPipeline

Channel的生命周期状态

状态 描述
ChannelUnregistered channel已被创建,但还未注册到EventLoop
ChannelRegistered Channel已经被注册到了EventLoop
ChannelActive Channel处于活跃状态(已经连接到远程节点),现在可以收发消息
channelInactive Channel没有连接到远程节点

ChannelHandler 的生命周期
Channel的正常生命周期,当状态发生改变,将会生成对应的事件。事件转发给ChannelPipeline中的ChannelHandler。

类型 描述
handlerAdded 当把ChannelHandler添加到ChannelPipeline时被调用
handlerRemoved 当从ChannelPipeline中移除ChannelHandler时触发
exceptionCaught 处理过程中有错误时触发

Netty 定义了下面两个重要的 ChannelHandler 子接口:

  • ChannelInboundHandler——处理入站数据以及各种状态变化;
  • ChannelOutboundHandler——处理出站数据并且允许拦截所有的操作。

ChannelInboundHandler

ChannelInboundHandler的方法:

类型 描述
channelRegistered Channel注册到EventLoop中并且能够处理I/O时被调用
channelUnregistered Channel从EventLoop中注销并且无法处理任何I/0时被调用
channelActive channel处于活跃状态时被调用;channel已经连接/绑定并且已经就绪
channelInactive channel离开活跃状态并且不再连接它的远程节点时被调用
channelReadComplete channel上的一个读操作完成时被调用
channelRead 当从channel中读取数据时被调用
channelWritabilityChanged 当channel的可写状态发生改变时调用,用户可以保证写操作不会完成的太快,或者在channel再次可写时恢复写入。与可写性相关的阈值可以通过Channel.config().setWriteHighWaterMark()和 Channel.config().setWriteLowWaterMark()方法来设置
userEventTriggered 当 ChannelnboundHandler.fireUserEventTriggered()方法被调用时被调用,因为一个 POJO 被传经了 ChannelPipeline

ChannelOutboundHandler 接口

出站操作和数据将由 ChannelOutboundHandler 处理。它的方法将被 Channel、ChannelPipeline 以及 ChannelHandlerContext 调用。netty(五)--ChannelHandler和ChannelPipeline_第1张图片

ChannelHandler 适配器

ChannelInboundHandlerAdapter 和 ChannelOutboundHandlerAdapter
这两个适配器分别提供了 ChannelInboundHandler和 ChannelOutboundHandler 的基本实现。
Netty 使用引用计数来处理池化的 ByteBuf。所以在完全使用完某个
ByteBuf 后,调整其引用计数是很重要的。
为了帮助你诊断潜在的(资源泄漏)问题, Netty提供了class ResourceLeakDetector级 别,它将对你应用程序的缓冲区分配做大约 1%的采样来检测内存泄露。相关的开销是非常小的。
netty(五)--ChannelHandler和ChannelPipeline_第2张图片
泄露检测级别可以通过将下面的 Java 系统属性设置为表中的一个值来定义:
java -Dio.netty.leakDetectionLevel=ADVANCED

netty(五)--ChannelHandler和ChannelPipeline_第3张图片
netty(五)--ChannelHandler和ChannelPipeline_第4张图片

触发事件

ChannelPipeline公开了调用入站和出站操作的附加方法。
入站操作

方法名称 描述
fireChannelRegistered 调用ChannelPipeline中下一个ChannelInboundHandler的chanelRegistered方法
fireChannelUnRegistered 调用ChannelPipeline中下一个ChannelInboundHandler的ChannelUnregistered方法
fireChannelActive 调用ChannelPipeline中下一个ChannelInboundHandler的channelActive方法
fireChannelInactive 调用ChannelPipeline中下一个ChannelInboundHandler的channelInactive方法
fireExceptionCaught 调用下一个ChannelInboundHandler的exceptionCaught方法
fireUserEventTriggered 调用下一个userEventTriggered
fireChannelRead 调用下一个channelRead方法
fireChannelReadComplete 调用下一个channelReadComplete
fireChannelWritabilityChanged 调用下一个channelWritabilityChanged方法

出站操作

方法名 描述
bind 将channel绑定到一个本地地址,这将调用channelPipeline中的下一个channelOutboundHandler的bind方法
connect 将channel连接到一个远程地址,调用下一个connect方法
disconnect 将channel断开连接,调用下一个disconnect
close 将channel关闭,调用下一个close方法
deregister 将channel从先前所分配的EventExecutor中注销,调用下一个channeloutboundhandler的deregister方法
flush 冲刷写入channel。调用下一个flush方法
write 将消息写入channel,调用下一个write方法(并不会将消息写入底层的socket,需要调用flush)
writeAndFlush
read 从channel中读取更多数据。调用下一个read方法

总结一下:

  • ChannelPipeline 保存了与 Channel 相关联的 ChannelHandler;
  • ChannelPipeline 可以根据需要,通过添加或者删除 ChannelHandler 来动态地修改;
  • ChannelPipeline 有着丰富的 API 用以被调用,以响应入站和出站事件。

ChannelHandlerContext接口

ChannelHandlerContext代表了ChannelHandler和ChannelPipeline之间的关联,每当有channelHandler添加到channelpipeline中时,都会创建channelHandlercontext。channelHandlerContext的主要功能是管理它所关联的channelHandler和在同一个ChannelPipeline中的其它channelHandler之间的交互。

netty(五)--ChannelHandler和ChannelPipeline_第5张图片在这里插入图片描述
netty(五)--ChannelHandler和ChannelPipeline_第6张图片
netty(五)--ChannelHandler和ChannelPipeline_第7张图片

你可能感兴趣的:(netty)