Netty 业务处理:ChannelHandler家族

摘要:
ChannelHandler适配器ChannelHandlerAdapter还提供了实用工具isSharable()。ChannelPipeline接口ChannelHandler可以通过添加、删除或替换其他ChannelHandler来实时修改ChannelPiperine的布局。)这是ChannelHandler最重要的功能之一。名称描述:AddFirstaddBefore和addAfteraddLast将ChannelHandler添加到ChannelPipeline。移除从ChannelPipeline中移除ChannelHandler。替换将ChannelPipeline中的ChannelHandler替换为另一个ChannelHandlerChannelHandler上下文接口。Channel和ChannelPipeline有许多相同操作的方法。在ChannelHandlerContext上调用相同的方法将从当前关联的ChannelHandler开始,并且只传播到ChannelPipeline中可以处理事件的下一个ChannelHandler。f、 isSuccess()){f.cause().printStackTrace();f.channel().close();}}});第二种方法是将ChannelFutureListener添加到ChannelPromise,它将作为参数传递给ChannelOut-boundHandler的方法。

ChannelHandler 接口

类型描述
handlerAddedChannelHandler添加到ChannelPipeline时被调用
handlerRemovedChannelHandler从ChannelPipeline时被调用
exceptionCaught处理过程中ChannelPipeline有错误

ChannelInBoundHandler接口

  • SimpleChannelInBoundHandler 会自动释放资源,调用了 ReferenceCountUtil.release(msg);

ChannelOutBoundHandler接口

可按需推迟操作和事件。大部分方法都接收一个ChannelPromise参数[ChannelFuture的一个子类]

这里借鉴的是 Scala 的 Promise 和 Future 的设计,当一个 Promise 被完成之后,其对应的 Future 的值便 不能再进行任何修改了。

ChannelHandler适配器

Netty 业务处理:ChannelHandler家族第1张

ChannelHandlerAdapter 还提供了实用方法 isSharable()。如果其对应的实现被标 注为 Sharable,那么这个方法将返回 true,表示它可以被添加到多个 ChannelPipeline 中.

为何要共享同一个ChannelHandler 在多个ChannelPipeline中安装同一个ChannelHandler 的一个常见的原因是用于收集跨越多个Channel的统计信息。

资源管理 ResourceLeakDetector

对你应用程序的缓冲区分配做大约1%的采样来检测内存泄露,ResourceLeakDetector利用了 JDK 提供的PhantomReference类来实现这一点。

ChannelPipeline 接口

ChannelHandler 可以通过添加、删除或者替换其他的 ChannelHandler 来实时地修改 ChannelPipeline的布局。(它也可以将它自己从ChannelPipeline中移除。)这是ChannelHandler最重要的能力之一。

名 称描 述
AddFirstaddBefore和addAfteraddLast将一个ChannelHandler添加到ChannelPipeline中
remove将一个ChannelHandler从ChannelPipeline中移除
replace将 ChannelPipeline 中的一个 ChannelHandler 替换为另一个 Channel- Handler

ChannelHandlerContext接口

和Channel和ChannelPipeline有很多相同操作的方法。

不同的是:如果调用Channel或者ChannelPipeline上的这 些方法,它们将沿着整个ChannelPipeline进行传播。而调用位于ChannelHandlerContext 上的相同方法,则将从当前所关联的 ChannelHandler 开始,并且只会传播给位于该 ChannelPipeline中的下一个能够处理该事件的ChannelHandler。

通过Channel,ChannelPipeline 和ChannelHandlerContext事件流的区别

 Netty 业务处理:ChannelHandler家族第2张

 Netty 业务处理:ChannelHandler家族第3张

异常处理

  • 入栈实现:exceptionCaught
  • 出站实现:对ChannelFuture添加监听器,判断ChannelFuture.isSuccess()
ChannelFuture future = channel.write(someMessage); 
future.addListener(new ChannelFutureListener() {     
    @Override     
    public void operationComplete(ChannelFuture f) {         
        if (!f.isSuccess()) {            
             f.cause().printStackTrace();             
             f.channel().close();         
             }     
    } 
});

第二种方式是将 ChannelFutureListener 添加到即将作为参数传递给 ChannelOut- boundHandler 的方法的 ChannelPromise。

public class OutboundExceptionHandler extends ChannelOutboundHandlerAdapter {     
    @Override     
    public void write(ChannelHandlerContext ctx, Object msg,         
    ChannelPromise promise) {         
        promise.addListener(new ChannelFutureListener() {             
            @Override             
            public void operationComplete(ChannelFuture f) {                 
                if (!f.isSuccess()) {                     
                    f.cause().printStackTrace();                     
                    f.channel().close();                 
                    }             
            }         
        });     
    } 
}

免责声明:文章转载自《Netty 业务处理:ChannelHandler家族》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHP动态修改配置文件《第一行代码》阅读笔记(二十二)——LitePal操作数据库下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Netty5 HTTP协议栈浅析与实践

一、说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端、移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析、分拣后从不同的维度做实时和离线分析。(ps:这种活儿本该由统计部门去做的,但由于各种原因落在了我头上,具体原因略过不讲……) 先用个“概念图”来描绘下整个系统的...

心有 netty 一点通!

一、标准的netty线程模型 双池合璧: 1、连接线程池: 连接线程池专门负责监听客户端连接请求,并完成连接的建立(包括诸如握手、安全认证等过程)。 连接的建立本身是一个极其复杂、损耗性能的过程,此处使用线程池,能够极大的增加处理客户端连接的能力。 2、I/O线程池: 连接线程池会将成功建立的连接注册到后端I/O线程池,由I/O线程池负责对相应连接的网络...

netty中的UDP

UDP 提供了向多个接收者发送消息的额外传输模式: 多播——传输到一个预定义的主机组; 广播——传输到网络(或者子网)上的所有主机。 本示例应用程序将通过发送能够被同一个网络中的所有主机所接收的消息来演示 UDP 广播的使用。为此,我们将使用特殊的受限广播地址或者零网络地址 255.255.255.255。 发送到这个地址的消息都将会被定向给本地网络...

Disruptor与Netty实现百万级(十)

实体对象: import java.io.Serializable; public class TranslatorData implements Serializable { private static final long serialVersionUID = 8763561286199081881L; private St...

Netty源码分析(前言, 概述及目录)

Netty源码分析(完整版) 前言 前段时间公司准备改造redis的客户端, 原生的客户端是阻塞式链接, 并且链接池初始化的链接数并不高, 高并发场景会有获取不到连接的尴尬, 所以考虑了用netty长连接解决连接数和阻塞io问题 为此详细阅读了netty源码, 熟悉了netty的各个主要的特性以及疏通各个组件的关联关系, 所以想把这段时间的学习内容, 学...

Netty(一) SpringBoot 整合长连接心跳机制

https://github.com/crossoverJie/JCSprout 原创:crossoverJie阅读原文 前言 Netty 是一个高性能的 NIO 网络框架,本文基于 SpringBoot 以常见的心跳机制来认识 Netty。 最终能达到的效果: 客户端每隔 N 秒检测是否需要发送心跳。 服务端也每隔 N 秒检测是否需要发送心跳。 服...