当前位置: 首页 > news >正文

[Netty] Channel和ChannelFuture和ChannelFutureListener (六)

文章目录

      • 1.Channel介绍
      • 2.ChannelFuture接口介绍
      • 3.GenericFutureListener接口介绍

1.Channel介绍

NIO的Channel与Netty的Channel 不一样

Netty重新设计了Channel接口,并且给予了很多不同的实现, Channel是Netty网络的抽象类, 除了NIO中Channel所包含的网络I/O操作, 主动建立和关闭连接外, 还包括了Netty框架的功能, 比如获取Channel的EventLoop和Pipeline。

在这里插入图片描述

Channel的基本方法

  • id():返回此通道的全局唯一标识符.
  • isActive():如果通道处于活动状态并连接,则返回true.
  • isOpen():如果通道打开并且可能稍后激活,则返回true.
  • isRegistered():如果通道注册了EventLoop,则返回true。
  • config():返回关于此通道的配置.
  • localAddress():返回此通道绑定的本地地址.
  • pipeline():返回分派的ChannelPipeline.
  • remoteAddress():返回此通道连接到的远程地址.
  • flush():请求通过ChannelOutboundInvoker将所有挂起的消息输出.

在这里插入图片描述

  • Channel接口是能与一个网络套接字(或组件)进行I/0操作(读取\写入\连接\绑定)的纽带
  • 通过Channel可以获取连接的状态(是否连接/是否打开), 配置通道的参数(设置缓冲区大小等), 进行I/O操作

Channel的释放

当Channel完成工作后, 需要调用ChannelOutboundInvoker.close()ChannelOutboundInvoker.close(ChannelPromise)释放所有资源. 这样做是为了确保所有资源(文件句柄)都能够得到释放

2.ChannelFuture接口介绍

在这里插入图片描述

Future最早出现于JDK的java.util.concurrent.Future, 表示异步操作的结果, 由于Netty的Future都是与异步I/O操作相关的, 因此命名为ChannelFuture, 代表它与Channel操作相关。
ChannelFuture的作用是用来保存Channel异步操作的结果, 提供了一种在操作完成时通知应用程序的方式。
Channel与ChannelFuture可以说形影不离的。

Channel channel();
ChannelFuture addListener(GenericFutureListener<? extends Future<? super Void>> listener);
ChannelFuture addListeners(GenericFutureListener<? extends Future<? super Void>>... listeners);
ChannelFuture removeListener(GenericFutureListener<? extends Future<? super Void>> listener);
ChannelFuture removeListeners(GenericFutureListener<? extends Future<? super Void>>... listeners);
ChannelFuture sync() throws InterruptedException;
ChannelFuture syncUninterruptibly();
ChannelFuture await() throws InterruptedException;
ChannelFuture awaitUninterruptibly();
  • ChannelFuture有两种状态:未完成(uncompleted)和完成(completed)
  • 当令Channel开始一个I/O操作时,会创建一个新的ChannelFuture去异步完成操作
  • 被创建时的ChannelFuture处于uncompleted状态(非失败,非成功,非取消);一旦ChannelFuture完成I/O操作,ChannelFuture将处于completed状态,结果可能有三种:
  1. 操作成功
  2. 操作失败
  3. 操作取消

在这里插入图片描述

3.GenericFutureListener接口介绍

GenericFutureListener是监听接口

优先使用addListener(GenericFutureListener),而非await()或sysn()

  • addListener是非阻塞的, 把特定的ChannelFutureListener添加到ChannelFuture中, ChannelFutureListener会利于最佳的性能和资源的利用。
  • await()是一个阻塞的操作。
  • ChannelFuture的sync()方法, 作用是阻塞main线程, 等到连接建立好程序才向下运行。Channel由主线程获取。
  • sync () 会抛出异常, 建议使用 sync (), await () 不会抛出异常, 主线程无法捕捉子线程执行抛出的异常。
  • ChannelFuture用addListener()方法。异步调用回调对象的operationComplete方法。
 @Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {ChannelFuture future = ctx.channel().close();future.addListener(new ChannelFutureListener() {public void operationComplete(ChannelFuture future) {// Perform post-closure operation// ...}});}

ChannelFutureListenerGenericFutureListener的实现类, 用于添加异步回调事件

ChannelFuture 允许添加一个或多个GenericFutureListener监听接口。

在这里插入图片描述

添加监听器源码:

    @Overridepublic Promise<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners) {checkNotNull(listeners, "listeners");synchronized (this) {for (GenericFutureListener<? extends Future<? super V>> listener : listeners) {if (listener == null) {break;}addListener0(listener);}}if (isDone()) {notifyListeners();}return this;}

addListener0()

负责把用户一个一个添加的listener对象转换为数组结构DefaultFutureListeners, 存储到listeners 成员变量

在这里插入图片描述

notifyListeners()

将通知回调任务添加到eventloop当中, eventloop当中的任务顺序就最后是notifyListeners(), 保证了发送消息后, 执行notifyListeners去调用监听器。

相关文章:

[Netty] Channel和ChannelFuture和ChannelFutureListener (六)

文章目录1.Channel介绍2.ChannelFuture接口介绍3.GenericFutureListener接口介绍1.Channel介绍 NIO的Channel与Netty的Channel 不一样 Netty重新设计了Channel接口,并且给予了很多不同的实现, Channel是Netty网络的抽象类, 除了NIO中Channel所包含的网络I/O操作, 主动建立和关…...

条件渲染

组件经常需要根据不同条件显示不同内容。在React中&#xff0c;你可以使用类似于if语句、&&和?:运算符的JavaScript语法有条件地呈现JSX。你将学到&#xff1a;如何根据条件返回不同的JSX如何有条件地包含或排除一段JSX在React代码库中常见的条件语法快捷方式有条件地…...

springboot(10)异步任务

文章目录1、SpringBoot异步任务1.1使用注解EnableAsync开启异步任务支持1.2使用Async注解标记要进行异步执行的方法1.3controller测试2.异步任务相关限制3.1自定义 Executor3.1.1应用层级&#xff1a;3.1.2方法层级&#xff1a;3.2自定义 Executor (第二种方式)4.1异常处理4.1.…...

清华大学开源的chatGLM-6B部署实战

Windows部署 win10 通过wsl部署 常见问题: torch.cuda.OutOfMemoryError: CUDA out of memory. 在Windows的系统环境变量中增加 变量名:PYTORCH_CUDA_ALLOC_CONF 变量值:max_split_size_mb:32 文档书写时使用3090 24G显存配置,其他规格酌情调整 32 至其他值,如未设置变…...

通过矩阵从整体角度搞懂快速傅里叶变换原理

离散傅里叶变换公式 公式 f[k]∑n0N−1g[n]e−i(2π/N)kn,其中(0<n<N)f[k]\sum_{n0}^{N-1}g[n]e^{-i(2\pi/N)kn}, 其中(0<n<N) f[k]n0∑N−1​g[n]e−i(2π/N)kn,其中(0<n<N) 逆变换公式 g[n]1N∑k0N−1f[k]ei(2π/N)kn,其中(0<k<N)g[n]\frac{1}{N}\…...

【C++从0到1】25、C++中嵌套使用循环

C从0到1全系列教程 1、实例代码 #include <iostream> // 包含头文件。 using namespace std; // 指定缺省的命名空间。int main() {// 超女分4个小组&#xff0c;每个小组有3名超女&#xff0c;在控制台显示每个超女的小组编号和组内编号。// 用一个循环…...

FastDFS与Nginx结合搭建文件服务器,并内网穿透实现公网访问

文章目录前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.1 …...

密集场景下的行人跟踪替代算法,头部跟踪算法 | CVPR 2021

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky LiEmail : 3435673055qq.com Time of completion&#xff1a;2023.4.8 Last edited: 2023.4.8 目录 摘要 主要内容 结果 这篇文章是CVPR 2021 的最新论文&#xff0c;文章的标题&#xff1a; 文章的主要内…...

Matlab与ROS(1/2)---服务端和客户端数据通信(五)

0. 简介 在前几讲我们讲了Matlab中的Message以及Topic的相关知识。而ROS主要支持的通信机制还有服务这一类。服务通过允许请求以及响应的通信方式&#xff0c;来给整个系统完成更紧密的耦合。服务客户端向服务服务器发送请求消息并等待响应。服务器将使用请求中的数据构造响应…...

数字化转型的避坑指南:细说数字化转型十二大坑

随着信息技术的快速发展&#xff0c;数字化转型已经成为许多企业发展的必经之路。然而&#xff0c;数字化转型过程中也存在许多坑&#xff0c;如果不谨慎处理&#xff0c;就可能导致企业陷入困境。本文将细说数字化转型的十二大坑&#xff0c;并提供相应的避坑指南。 1、不了解…...

pt05Encapsulationinherit

Encapsulation &inherit 封装继承 封装 向类外提供必要的功能&#xff0c;隐藏实现的细节, 代码可读性更高优势&#xff1a;简化编程&#xff0c;使用者不必了解具体的实现细节&#xff0c;只需要调用对外提供的功能。私有成员&#xff1a;作用&#xff1a;无需向类外提供…...

面向对象编程(基础)9:封装性(encapsulation)

目录 9.1 为什么需要封装&#xff1f; 而“高内聚&#xff0c;低耦合”的体现之一&#xff1a; 9.2 何为封装性&#xff1f; 9.3 Java如何实现数据封装 9.4 封装性的体现 9.4.1 成员变量/属性私有化 实现步骤&#xff1a; 成员变量封装的好处&#xff1a; 9.4.2 私有化…...

fate-serving-server增加取数逻辑并源码编译

1.什么是fate-serving-server? FATE-Serving 是一个高性能、工业化的联邦学习模型服务系统&#xff0c;专为生产环境而设计,主要用于在线推理。 2.fate-serving-server源码编译 下载fate-serving-serving项目&#xff08;GitHub - FederatedAI/FATE-Serving: A scalable, h…...

循环队列、双端队列 C和C++

队列 目录 概念 实现方式 顺序队列 循环队列 队列的数组实现 用循环链表实现队列 STL 之 queue 实现队列 STL 之 dequeue 实现双端队列 概念 队列是一种特殊的线性表&#xff0c;它只允许在表的前端&#xff08;称为队头&#xff0c;front&#xff09;进行删除操作…...

正则表达式(语法+例子)

文章目录一、介绍二、语法1、匹配字符2、表示数量的字符3、边界字符4、其他字符5、转义字符三、例子1、邮箱2、用逗号分隔的数字集合1,23、允许一位小数4、20yy-mm-dd日期格式5、手机号6、匹配html、xml标签一、介绍 正则表达式&#xff08;Regular Expression&#xff09;&am…...

Properties和IO流集合的方法

方法名说明void load(InputStream inStream)从输入字节流读取属性列表&#xff08;键和元素&#xff09;void load(Reader reader)从输入字符流读取属性列表&#xff08;键和元素对&#xff09;void store(OutputStream out,String comments)将此属性列表&#xff08;键和元素对…...

python 生成器、迭代器、动态新增属性及方法

目录 一、生成器 1、生成器定义 2、生成器存在的意义 3、创建生成器方式一&#xff08;生成器表达式&#xff09; 4. 创建生成器方式二&#xff08;生成器函数&#xff09; 1. 生成器函数 2. 生成器函数的工作原理 5. 总结 1. 什么是生成器 2. 生成器特点 二、迭代器…...

Java处理JSON

Java处理json有很多种方法&#xff0c;在这里总结一下。 1 Jackson Spring MVC 默认采用Jackson解析Json&#xff0c;出于最小依赖的考虑&#xff0c;也许Json解析第一选择就应该是Jackson。 1.1 引入的包 Jackson核心模块由三部分组成&#xff1a;jackson-core、jackson-a…...

58-Map和Set练习-LeetCode692前k个高频单词

题目 给定一个单词列表 words 和一个整数 k &#xff0c;返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率&#xff0c; 按字典顺序 排序。 示例 1&#xff1a; 输入: words ["i", "love", …...

线程生命周期及五种状态

文章目录一、线程生命周期及五种状态1、New(初始化状态)2、Runnable(就绪状态)3、Running(运行状态)4、Blocked(阻塞状态)5、Terminated&#xff08;终止状态&#xff09;二、线程基本方法1、线程等待&#xff08;wait&#xff09;2、线程睡眠&#xff08;sleep&#xff09;3、…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...