Netty中的适配器、Handler共享和资源管理

ChannelHandler的适配器

有一些适配器类可以将编写自定义的ChannelHandler所需要的工作降到最低限度,
因为它们提供了定义在对应接口中的所有方法的默认实现。因为有时会忽略那些不感兴趣的
事件,所以Netty提供了抽象积累ChannelInboundHandlerAdapter(处理入站)和
ChannelOutboundHandlerAdapter(处理出站)的基本实现,通过扩展抽象类ChannelHandlerAdapter,
它们获得了它们共同的超接口ChannelHandler的方法.不过ChannelOutboundHandler有个非常让人
迷惑的read()方法,ChannelOutboundHandler不是处理出站事件的吗?怎么会有read()方法呢?
其实这个read方法不是表示读数据,而是表示业务发出了读(read)数据的要求,这个要求也会封装为
一个事件进行传播,这个事件因为时业务发出到网络的,自然就是个出站事件,而且这个事件触发的就是ChannelOutboundHandler中read()方法。如果Handler纪要处理入站又要处理出站怎么办呢?这个时候就可以使用类ChannelDuplexHandler,当然也可以同时实现ChannelOutboundHandler,ChannelInboundHandler这两个接口
在这里插入图片描述

Handler的共享和并发安全性

ChannelHandlerAdapter还提供了实用方法isSharable().如果其对应的实现被标注为Sharable,那么这个方法,将返回true,表示它可以被添加到多个ChannelPipeline.这就牵涉到了我们实现的Handler的共享性和线程安全性。在往pipeline安装Handler的时候,基本上都是new出Handler的实例,因为每个socketChannel有自己的pipeline,而且每个socketChannel又是和线程绑定的,所以这些Handler的实例之间完全独立的,只要Handler的实例不是共享了全局变量,Handler的实例是线程安全的
但是如果业务需要在多个SocketChannel之间共享一个Handler的实例怎么办呢?比如统计服务器接收到和发出的业务报文总数,我们就需要用一个Handler的实例来横跨所有的socketChannel来统计socketChannel业务报文数。为了实现这一点,我们可以实现一个MessageCountHandler,并且在MessageCountHandler上使用Netty的@Sharable,然后在安装MessageCountHandler到MessageCountHandler的统计功能时,请务必注意线程安全,具体实现时就使用Java并发编程里的Atomic类来保证这一点
在这里插入图片描述

资源管理和SimpleChannelInboundHandler

回想一下我们在NIO中时如何接收和发送网络数据的?都是首先创建了一个Buffer,应用程序中的业务部分和Channel之间通过Buffer进行数据的交换:ByteBuffer.allocate(1024),如图所示
Netty在处理网路数据时,同样也需要Buffer,在Read网络数据时由Netty创建Buffer,Write网络数据时Buffer往往由业务方创建的。不管是读和写,Buffer用完后都必须进行释放,否则可能会造成内存泄漏,在Write网络数据时,可以确保数据被写往网络了,Netty会自动进行Buffer的释放,但是如果Write网络数据时,我们有outBoundHandler处理了write()操作并丢弃了数据,没有继续往下写,要由我们负责释放这个Buffer,就必须调用ReferenceCountUtil.release()方法,否则就可能造成内存泄漏。在Read网络数据时,如果我们可以确保每个Inboundhandler都把数据往后传递了,也就是调用了相关的
fireChannelRead()方法,Netty也会帮我们释放,同样的,如果我们有InboundHandler处理了数据,又不继续往后传递,又不调用负责释放的ReferenceCountUtil.release()方法,就可能会造成内存泄漏。
但是由于消费入站数据是一项常规任务,所以Netty提供了一个特殊的被称为SimpleChannelInboundHandler的ChannelInboundHandler实现,这个实现会在数据被channelRead0()方法消费之后自动释放数据,同时系统为我们提供的各种预定义的Handler实现,都实现了数据的正确处理,所以我们自行在编写业务Handler时,也需要注意:要么继续传递,
要那么自行释放
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/473487.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深夜突发! OpenAI震撼发布了SORA文生视频模型,对职场人的影响可能跟你想的不一样

深夜突发! OpenAI震撼发布了SORA文生视频模型,对职场人的影响可能跟你想的不一样。 马上就要节后返工了,顾问老师也早已回到了温暖的广州。与一位同城的学员相聚在老广州的一个茶楼中,喝起了下午茶。面对各式的广式茶点,在淡淡的茶…

防火墙 iptables(二)--------------------SNAT与DNAT

一、SNAT ①SNAT 应用环境: 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) ②SNAT原理: 源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映射 数据包从内网发送到公网时,SNAT会把数据包的源IP由…

Shokz韶音是运动耳机的领导品牌

在一年一度的Keep官方营销沙龙Keep自由营上,运动耳机领导品牌Shokz韶音和全球运动科技App Keep共同宣布达成深度合作。Shokz韶音运动耳机将成为Keep官方合作运动耳机。同时,双方将在线上赛事、电商购物、新品发布乃至圈层耕耘等诸多方面,展开全方位合作。 Shokz韶音是运动耳机的…

前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理)

目录 一.浏览器渲染原理 二.渲染时间点 三.渲染流水线 1.解析html(Parse HTML) 1.1解析成DOM树(document object model) 1.2解析成CSSOM树(css object model) 2.样式计算(Recalculate Style) 3.布局(Layout) 4.分层(Layer) 5. 绘制(Paint) 6.分块(Tiling) 7. 光栅化…

java 课程签到管理系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java 课程签到管理系统是一套完善的java web信息管理系统 采用serlvetdaobean,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0…

【Linux】进程信号的保存 | 自定义捕捉

文章目录 三、信号的阻塞(信号的保存)1. 信号相关其他常见概念2. 在内核中的表示3. sigset_t类型4. 信号集操作函数函数列表注意事项 5. 读取/修改block位图 - sigprocmask6. 读取pending位图 - sigpending 四、信号捕捉1. 信号捕捉的初步认识自定义捕捉…

【Python--Web应用框架大比较】

🚀 作者 :“码上有前” 🚀 文章简介 :Python 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Django Django太重了,除了web框架,自带ORM和模板引擎,灵活和自由度不…

android获取sha1

1.cmd在控制台获取 切换到Android Studio\jre\bin目录下执行keytool -list -v -keystore 签名文件路径例如: 2.也可以在android studio中获取 在Terminal中输入命令:keytool -list -v -keystore 签名文件路径获取 获取到的sha1如下:

【分享】JLINK的SW调试模式连线方式

大家知道,JLINK有2种调试模式:JTAG和SWD(串行模式)。 JTAG是常用模式,大家都熟悉、不废话了;如果使用SW模式,需要(只需要)4根连线,连接方式如下: …

四种mfc140u.dll丢失的解决方法,有效恢复mfc140u.dll丢失

mfc140u.dll文件的重要性,当系统中出现mfc140u.dll丢失的情况时,可能会导致一系列问题和影响。因此,保持mfc140u.dll文件的完整性对于系统和应用程序的稳定运行至关重要。一旦出现mfc140u.dll文件丢失的情况,我们需要采取有效的方…

【Linux系统化学习】缓冲区

目录 缓冲区 一个样例 现象解释 缓冲区存在的位置 缓冲区 在刚开始学习C语言的时候我们就听过缓冲区这个名词,很是晦涩难懂;在Linux下进程退出时也包含缓冲区,因此缓冲区到底是什么?有什么作用? 让我们先从一个小…

设计模式Python实现

过年在家瞎折腾,闲着无聊看到设计模式,于是就想着用Python实现一下。 简单工厂 根据传入的参数决定创建出哪一种产品类的实例。 class CashFactory:def createCashAdapter(self, type):if type "满100减20":return CashReturn(100, 20)elif…