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