Channel的生命周期
| 状态 | 描述 |
|---|---|
| ChannelUnRegistered | Channel已经被创建,但还未注册到EventLoop |
| ChannelRegistered | Channel已被注册到EventLoop |
| ChannelActive | Channel处于活动状态,已经连接到远程节点 |
| ChannelInActive | Channel未连接到远程节点 |
ChannelHandler的生命周期
| 状态 | 描述 |
|---|---|
| handlerAdded | 当添加到ChannelPipline时被调用 |
| handlerRemoved | 从ChannelPipline移除hanlder时调用 |
| exceptionCaught | 在ChannelPipline中有错误产生时调用 |
ChannelInBoundHandler
当该接口实现重写channelRead()方法时,它需要负责显式的释放与池化的ByteBuf实例相关的内存,netty提供了实用的方法
@ChannelHandler.Sharable
public class DisHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ReferenceCountUtil.release(msg); //丢弃已接收的消息
}
}
还可以通过SimpleChannelInBoundHandler自动释放资源
@ChannelHandler.Sharable
public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {
//nothing to do
}
}
ChannelOutBoundHandler
ChannelOutBoundHandler处理出站操作和数据,它有一个特殊的强大的功能,可以按需推迟操作或事件
ChannelHandler适配器
选用ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter作为操作起始点,通过拓展抽象类ChannelHandlerAdapter,它们获得了共同的超接口ChannelHandler的方法
资源管理
通过调用channelRead或者write方法处理数据,需要确保没有资源泄漏。netty提供了ResourceLeakDetector帮助诊断潜在的资源泄漏问题,共分为四个级别
- DISABLED:禁用泄漏检测
- SIMPLE:1%采样
- ADVANCED:默认采样级别,报告任何的泄漏
- PARANOID:类似于2,对每次的访问都会采样,建议在调试时使用
通过java系统属性进行设置
java -Dio.netty.leakDetectionLevel=ADVANCED
ChannelPipline接口
每一个新创建的Channel都会被分配一个新的ChannelPipline,既不能分离当前Pipline,也不能添加到另一个Pipline,这是固定操作,不需要使用者干预
在ChannelPipline传播事件时,会测试下一个ChannelHandler类型的是否和事件的运动方向匹配,如果不匹配,则会跳到下一个
修改ChannelPipline
调用Pipline的方法,ChannelHandler可以添加,删除或者替换其他ChannelHandler,从而实现动态修改
ChannelPipeline pipeline = ctx.pipeline();
SimpleChannelInboundHandler handler = new EchoClientHandler();
pipeline.addLast("first",handler);
ChannelHandlerContext接口
ChannelHandlerContext包含很多方法,其中一些也存在与Channel和ChannelPipline本身,区别在于,调用前者的方法,会沿着整个pipline进行传播,而后者会从当前所关联的ChannelHandler开始,并且只会传播给位于ChannelPipline中的下一个能处理该事件的ChannelHandler