ChannelFuture 缺乏、安全感 2024-04-17 06:25 53阅读 0赞 ChannelFuture 异步Channel IO操作的结果占位符 Netty中所有的IO都是异步的,这意味着任何IO调用都将立即返回,并且不保证在调用结束时所请求的IO操作已完成 ChannelFuture包含了未完成或已完成。 当IO操作开始时,将创建一个新的Future对象,新的Future最初是未完成的 - 它既没有成功,也没有被取消,也没有被取消,因为IO操作还没有完成。 如果IO操作成功完成,失败或取消,则将使用更具体的信息(例如失败原因)将Future标记为已完成。 请注意,即使失败和取消也属于已完成的状态。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lvb25lZXA_size_16_color_FFFFFF_t_70][] 很多方法用来检查IO操作是否已完成,等待完成,并检索IO操作的结果。 它还允许您添加ChannelFutureListeners,以便在IO操作完成时收到通知。 addListener(GenericFutureListener)优于await(); addListener非阻塞,只需要添加到Future,最佳性能和资源利用率 await是阻塞的,调用后线程一直阻塞到操作完成,实现顺序逻辑容易 Tips: 不要在ChannelHandler中调用await() ChannelHandler中的事件处理程序方法通常由IO线程调用。 如果事件处理程序方法(由IO线程调用)调用await(),则它正在等待的IO操作可能永远不会完成,因为await()可以阻止它正在等待的IO操作,这是一个死锁。 // BAD - NEVER DO THIS @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { ChannelFuture future = ctx.channel().close(); future.awaitUninterruptibly(); // Perform post-closure operation // ... } // GOOD @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { ChannelFuture future = ctx.channel().close(); future.addListener(new ChannelFutureListener() { public void operationComplete(ChannelFuture future) { // Perform post-closure operation // ... } }); } 不要混淆IO超时和等待超时 使用await(long),await(long,TimeUnit),awaitUninterruptibly(long)或awaitUninterruptibly(long,TimeUnit)指定的超时值与IO超时完全无关。 如果IO操作超时,则将来标记为“已完成但失败”,如上图所示。 例如,应通过特定于传输的选项配置连接超时: // BAD - NEVER DO THIS Bootstrap b = ...; ChannelFuture f = b.connect(...); f.awaitUninterruptibly(10, TimeUnit.SECONDS); if (f.isCancelled()) { // Connection attempt cancelled by user } else if (!f.isSuccess()) { // You might get a NullPointerException here because the future // might not be completed yet. f.cause().printStackTrace(); } else { // Connection established successfully } // GOOD Bootstrap b = ...; // Configure the connect timeout option. b.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000); ChannelFuture f = b.connect(...); f.awaitUninterruptibly(); // Now we are sure the future is completed. assert f.isDone(); if (f.isCancelled()) { // Connection attempt cancelled by user } else if (!f.isSuccess()) { f.cause().printStackTrace(); } else { // Connection established successfully } [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lvb25lZXA_size_16_color_FFFFFF_t_70]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/16/6a69842d80664c6ca4237f8224629379.png
相关 ChannelFuture hannelFuture 异步Channel IO操作的结果占位符 Netty中所有的IO都是异步的,这意味着任何IO调用都将立即返回,并且不保证在调用结束时所请求... 缺乏、安全感/ 2024年04月17日 06:25/ 0 赞/ 54 阅读
相关 【Netty】从0到1(八):入门-ChannelFuture 与 CloseFuture 前言 本篇博文是《从0到1学习 Netty》系列的第八篇博文,主要内容是介绍 Netty 中 ChannelFuture 与 CloseFuture 的使用,解决连接问题 冷不防/ 2023年10月11日 23:39/ 0 赞/ 6 阅读
相关 ServerBootstrap常用方法和ChannelFuture接口 ServerBootstrap的常用方法 该类算是一种容器类,它主要存放服务器的配置项和处理器(Executor)等信息。 它可以视为一个包含各种设置和组件的 冷不防/ 2023年09月27日 18:14/ 0 赞/ 7 阅读
相关 Netty中8大组件详解(EventLoop、Channel、ChannelFuture、Future、 Promise、Handler 、 Pipeline、ByteBuf) Netty 概述 1、什么是 Netty Netty is an asynchronous event-driven network application r囧r小猫/ 2023年09月23日 20:18/ 0 赞/ 147 阅读
相关 Netty ChannelFuture 异步监听 Netty ChannelFuture 异步监听 1. 前言 本节主要讲解 ChannelFuture ,它的作用是用来保存 Channel 异步操作的结果,可以看 野性酷女/ 2022年10月24日 13:23/ 0 赞/ 187 阅读
相关 95-24-030-Future-ChannelFuture 文章目录 1. 概述 2. 继承体系 3. java.util.concurrent.Future 4. java.util.concurrent 蔚落/ 2022年09月10日 08:24/ 0 赞/ 97 阅读
相关 Channel、EventLoop、ChannelFuture Channel、EventLoop(Group) 和ChannelFuture 1. Channel—Socket; 2. ChannelFuture—异步通知。 3 阳光穿透心脏的1/2处/ 2022年04月25日 00:26/ 0 赞/ 236 阅读
相关 Netty Channel和ChannelFuture Channel介绍 首先强调一点:NIO的Channel与Netty的Channel不是一个东西! Netty重新设计了Channel接口,并且给予了很多不同的实现。 ╰半橙微兮°/ 2022年04月18日 01:19/ 0 赞/ 261 阅读
相关 如何理解netty的ChannelFuture 类 目录 一、java.util.concurrent.Future 二、java.util.concurrent.FutureTask 三、io.netty.util.co 墨蓝/ 2021年12月10日 05:02/ 0 赞/ 326 阅读
还没有评论,来说两句吧...