当前位置: 首页 > 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去调用监听器。

http://www.lryc.cn/news/56190.html

相关文章:

  • 条件渲染
  • springboot(10)异步任务
  • 清华大学开源的chatGLM-6B部署实战
  • 通过矩阵从整体角度搞懂快速傅里叶变换原理
  • 【C++从0到1】25、C++中嵌套使用循环
  • FastDFS与Nginx结合搭建文件服务器,并内网穿透实现公网访问
  • 密集场景下的行人跟踪替代算法,头部跟踪算法 | CVPR 2021
  • Matlab与ROS(1/2)---服务端和客户端数据通信(五)
  • 数字化转型的避坑指南:细说数字化转型十二大坑
  • pt05Encapsulationinherit
  • 面向对象编程(基础)9:封装性(encapsulation)
  • fate-serving-server增加取数逻辑并源码编译
  • 循环队列、双端队列 C和C++
  • 正则表达式(语法+例子)
  • Properties和IO流集合的方法
  • python 生成器、迭代器、动态新增属性及方法
  • Java处理JSON
  • 58-Map和Set练习-LeetCode692前k个高频单词
  • 线程生命周期及五种状态
  • OBCP第八章 OB运维、监控与异常处理-灾难恢复
  • 亚马逊云科技Serverless Data:数字经济下的创新动能
  • 【Ruby学习笔记】15.Ruby 异常
  • 聊聊MySQL主从延迟
  • 【C++从0到1】19、C++中多条件的if语句
  • 【多微电网】计及碳排放的基于交替方向乘子法(ADMM)的多微网电能交互分布式运行策略研究(Matlab代码实现)
  • Linux(centos7)安装防火墙firewalld及开放端口相关命令
  • Linux部署.Net Core Web项目
  • 【C++】STL之stack、queue的使用和模拟实现+优先级队列(附仿函数)+容器适配器详解
  • 第⑦讲:Ceph集群RGW对象存储核心概念及部署使用
  • 从异步到promise