Netty - ChannelHandler和ChannelPipline

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帮助诊断潜在的资源泄漏问题,共分为四个级别

  1. DISABLED:禁用泄漏检测
  2. SIMPLE:1%采样
  3. ADVANCED:默认采样级别,报告任何的泄漏
  4. 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容