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.mzph.cn/news/686195.shtml

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

相关文章

OpenCV 4基础篇| OpenCV简介

目录 1. 什么是OpenCV2. OpenCV的发展历程3. 为什么用OpenCV4. OpenCV应用领域5. OpenCV的功能模块5.1 基本模块5.2 扩展模块5.3 常用函数目录 1. 什么是OpenCV OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它…

BUGKU-WEB bp

题目描述 题目截图如下: 进入场景看看: 解题思路 提示说:弱密码top1000?z???(爆破?)先看看源码有没有提示 相关工具 Burp Suit 爆破top1000字典,点击下载 解题步骤 随便测试账号密码admin、admin 得到提…

【AIGC】Stable Diffusion之模型微调工具

推荐一款好用的模型微调工具,cybertron furnace 是一个lora训练整合包,提供训练 lora 模型的工具集或环境。集成环境包括必要的依赖项和配置文件、预训练脚本,支持人物、二次元、画风、自定义lora的训练,以简化用户训练 lora 模型…

【刷题】牛客— NC21 链表内指定区间反转

链表内指定区间反转 题目描述思路一(暴力破解版)思路二(技巧反转版)思路三(递归魔法版)Thanks♪(・ω・)ノ谢谢阅读!!!下一篇文章见&…

LV.23 D2 开发环境搭建及平台介绍 学习笔记

一、Keil MDK-ARM简介及安装 Keil MDK,也称MDK-ARM,Realview MDK (Microcontroller Development Kit)等。目前Keil MDK 由三家国内代理商提供技术支持和相关服务。 MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备…

选择排序和快速排序(1)

目录 选择排序 基本思想 选择排序的实现 图片实现 代码实现 快速排序 基本思想 快速排序的实现 图片实现 代码实现 选择排序 基本思想 每一次从待排序的数据元素中选出最小(最大)的元素,存放在序列的起始位置,直到全部…

网络原理-TCP/IP(7)

目录 网络层 路由选择 数据链路层 认识以太网 以太网帧格式 认识MAC地址 对比理解MAC地址和IP地址 认识MTU ARP协议 ARP协议的作用 ARP协议工作流程 重要应用层协议DNS(Domain Name System) DNS背景 NAT技术 NAT IP转换过程 NAPT NAT技术的优缺点 网络层 路由…

《Go 简易速速上手小册》第4章:接口与抽象(2024 最新版)

文章目录 4.1 接口的定义与实现 - Go 语言的多面手4.1.1 基础知识讲解4.1.2 重点案例:动物乐队功能描述实现代码 4.1.3 拓展案例 1:通用支付系统拓展案例 1:通用支付系统功能描述实现代码 4.1.4 拓展案例 2:动物园管理器拓展案例 …

旅游出门千万别忘带这些!花的不多,享受翻倍!随身wifi看这篇,高性价比高口碑随身wifi推荐

春节长假,大家都去哪儿玩了呢?我反正带着我的小背包,走遍了祖国的大好河山! 得益于之前几次长假出行的经验,这次出行体验十分完美。除了详细完备的出行攻略,还有就是一些出行好物,虽然不起眼&am…

【python】python入门(变量名)

Hi~ o(* ̄▽ ̄*)ブ今天一起来看看python入门之变量名吧~~ 变量名的规定: 举个例子: “违法”的变量名们 my love/my !love错误:中间不能是空格或者其他符号1my_love错误:不能数字开头"my_l…

shell编程:求稀疏数组中元素的和(下标不连续)

#!/bin/basharr([2]3 [5]2 [6]2 [9]1)for i in "${!arr[]}" dosum$((sumarr[i])) doneecho $sumBash 脚本中,* 和 符号在数组上下文中有不同的用途。当使用它们来遍历数组时,必须了解它们之间的区别。 * (无前置感叹号 !): 在索引…

用HTML、CSS和JS打造绚丽的雪花飘落效果

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetGBK"><style>* {margin: 0;padding: 0;}#box {width: 100vw;heig…

Swift Combine 使用 ObservableObject 与 SwiftUI 模型作为发布源 从入门到精通二十

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

C语言系列(所需基础:大学C语言及格)-1-编译器/简单的求和代码/数据类型/变量的分类/变量的作用域和生命周期

文章目录 一、编译器&#xff08;使用在线编译器&#xff09;二、简单的求和代码三、数据类型四、变量的分类五、变量的作用域和生命周期 一、编译器&#xff08;使用在线编译器&#xff09; 为了方便&#xff0c;我使用的是在线的C语言编译器进行程序的运行。 链接&#xff1…

HTTP协议-响应报文详解(Respond)

目录 前言&#xff1a; 1.Respond报文 1.1报文格式 1.2格式图解 2.状态行&#xff08;首行&#xff09; 2.1状态码/状态码解释 &#xff08;1&#xff09;200 OK &#xff08;2&#xff09;404 Not Found &#xff08;3&#xff09;403 Forbidden &#xff08;4&#…

书生浦语大模型实战营-课程笔记(4)

微调分为两种&#xff0c;增量预训练和指令跟随。 指令跟随微调&#xff1a; 1.只对答案计算Loss 2.训练时数据为一问一答的形式&#xff08;input和output&#xff09; 增量预训练&#xff1a; 只需要output的数据进行训练 xtuner:微调框架 操作部分的笔记参考git上的文档…

模块、包、库的区别

这三者都是通过import和from…import…语句实现的。 模块&#xff08;module&#xff09; Python 模块(Module)&#xff0c;是一个 Python 文件&#xff0c;以 .py 结尾&#xff0c;包含了 Python 对象定义和Python语句。 简单来说任何一个以.py的文件都可以视为是一个模块(…

人工智能学习与实训笔记(六):神经网络之智能推荐系统

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 七、智能推荐系统处理 7.1 常用的推荐系统算法 7.2 如何实现推荐 7.3 基于飞桨实现的电影推荐模型 7.3.1 电影数据类型 7.3.2 数据处理 7.3.4 数据读取器 7.3.4 网络构建 7.3.4.1用户特…

家庭动态网络怎么在公网访问主机数据?--DDNS配置(动态域名解析配置)

前言 Dynamic DNS是一个DNS服务。当您的设备IP地址被互联网服务提供商动态变更时,它提供选项来自动变更一个或多个DNS记录的IP地址。 此服务在技术术语上也被称作DDNS或是Dyn DNS 如果您没有一个静态IP,那么每次您重新连接到互联网是IP都会改变。为了避免每次IP变化时手动更…

使用C++,实现高精度加减乘除法运算!

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 我的专栏&#xff1a; \mathcal{{\color{Green} 我的专栏&#xff1a;} } 我的专栏&#xff1a; 《精选文章》《算法》《每日一道编程题》《高精度算法》 文章目录 前言高精度计算初始模版string 转…