netty中Future和ChannelHandler

netty中的Future,继承自 jdk中的Future,, jdk中的Future,很垃圾,只能同步阻塞获取结果,,,

netty中的Future进行了升级,,可以addListener()异步获取结果,,可以isSuccess()判断任务成功还是失败,,

  • jdk的Future
    • get()
    • isDone()
    • cancel() : 取消当前任务
  public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService service = Executors.newFixedThreadPool(2);Future<Integer> future = service.submit(() -> {log.debug("running...");Thread.sleep(2000);return 2;});Integer i = future.get();log.debug("i = " + i);}
  • netty中的Future
    • isSuccess() : 判断任务是否成功
    • sync() : 同步等待,,任务不成功会抛错
    • getNow() : 获取结果,没有就返回null
    • await() : 同步等待,,任务不成功不会报错,,后面通过isSuccess()判断是否成功
    • addListener() : 任务结束回调
  public static void main(String[] args) {// netty中的线程池  eventLoop,, eventloop中就一个线程NioEventLoopGroup group = new NioEventLoopGroup(2);EventLoop eventLoop = group.next();Future<String> future = eventLoop.submit(() -> {Thread.sleep(2000);return "hehe";});String now = future.getNow();System.out.println("now = " + now);boolean success = future.isSuccess();System.out.println("success = " + success);future.addListener(new GenericFutureListener<Future<? super String>>() {@Overridepublic void operationComplete(Future<? super String> future) throws Exception {Object now1 = future.getNow();System.out.println("now1 = " + now1);boolean success = future.isSuccess();System.out.println("success = " + success);}});}
  • netty中的Promise
    继承自netty的Future,
    Promise可以设置成功和失败,,不用等到任务结束
    public static void main(String[] args) throws ExecutionException, InterruptedException {EventLoopGroup group = new NioEventLoopGroup(2);EventLoop eventLoop = group.next();// 主动创建promise  ===> 结果的容器,DefaultPromise<Integer> promise = new DefaultPromise<>(eventLoop);new Thread(()->{System.out.println("开始计算");try {int i = 1/0;Thread.sleep(1000);promise.setSuccess(1000);} catch (InterruptedException e) {e.printStackTrace();promise.setFailure(e);}//}).start();Integer i = promise.get();System.out.println("i = " + i);}
ChannelHandler

netty中handler分为两类:

  • ChannelInboundHandler : 入站,, 读取数据,,,channel按照添加顺序依次执行
  • ChannelOutboundHandler :出站 : 发送数据,,channel 逆序执行

channel.wirte() : 从末尾逆序执行
ctx.wirte() : 是从当前的handler,往前面找ChannelOutboundHandler执行

 public static void main(String[] args) {new ServerBootstrap().group(new NioEventLoopGroup(2)).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<NioSocketChannel>() {@Overrideprotected void initChannel(NioSocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();// 添加处理器  ,,, netty会自动添加两个handler,,一个叫head,,一个叫tail,,,// 底层是 双向链表pipeline.addLast("handle01",new ChannelInboundHandlerAdapter(){// 入站的handler,,一般关心的 read@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {log.debug("msg:{}",msg);ByteBuf byteBuf = (ByteBuf) msg;String s = byteBuf.toString(Charset.defaultCharset());// 调用下一个handle       ctx.fireChannelRead(msg);,,并且将处理完成的结果,传递给下一个handlersuper.channelRead(ctx, s);}});pipeline.addLast("handle02",new ChannelInboundHandlerAdapter(){// 入站的handler,,一般关心的 read@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {log.debug("msg222:{}",msg);User user = new User();user.setName(((String) msg));super.channelRead(ctx, user);}});pipeline.addLast("handle03",new ChannelInboundHandlerAdapter(){// 入站的handler,,一般关心的 read@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {log.debug("msg333:{}",msg);super.channelRead(ctx, msg);ch.writeAndFlush(ctx.alloc().buffer().writeBytes("server".getBytes()));}});// 出站是,,从后面往前走  ,,只有有写出的时候,才会触发出站方法,,,,pipeline.addLast("handle04",new ChannelOutboundHandlerAdapter(){@Overridepublic void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {log.debug("msg444:{}",msg);super.write(ctx, msg, promise);}});pipeline.addLast("handle05",new ChannelOutboundHandlerAdapter(){@Overridepublic void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {log.debug("msg555:{}",msg);super.write(ctx, msg, promise);}});}}).bind(new InetSocketAddress(8080));}
EmbeddedChannel 模拟channel执行
    public static void main(String[] args) {ChannelInboundHandlerAdapter h1 = new ChannelInboundHandlerAdapter(){@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {System.out.println("msg = " + msg);super.channelRead(ctx, msg);}};ChannelOutboundHandlerAdapter h2 = new ChannelOutboundHandlerAdapter(){@Overridepublic void write(ChannelHandlerContext channelHandlerContext, Object o, ChannelPromise channelPromise) throws Exception {System.out.println(4444);}};EmbeddedChannel channel = new EmbeddedChannel(h1,h2);
//        channel.writeInbound(ByteBufAllocator.DEFAULT.buffer().writeBytes("hehe".getBytes()));channel.writeOutbound(channel.writeOutbound(ByteBufAllocator.DEFAULT.buffer().writeBytes("hehe".getBytes())));}

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

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

相关文章

java 初学知识点总结

自己总结着玩 1.基本框架 public class HelloWorld{ public static void main(String[] args){ }//类名用大写字母开头 } 2.输入&#xff1a; (1)Scanner:可读取各种类型&#xff0c;字符串相当于cin>>; Scanner anew Scanner(System.in); Scan…

质量属性场景描述

为了精确描述软件系统的质量属性&#xff0c;通常采用质量属性场景&#xff08;Quality Attribute Scenario&#xff09;作为描述质量属性的手段。质量属性场景是一个具体的质量属性需求&#xff0c;使利益相关者与系统的交互的简短陈述。 质量属性场景是一种用于描述系统如何…

数据可携带权的多重价值与实践思考

文章目录 前言一、数据可携带权的提出与立法二、数据可携带权的多重价值1、推动数据要素市场化配置2、促进市场竞争与创新3、强化个人数据权益 三、数据可携带权的实践挑战1、数据安全与隐私保护面临风险2、接口差异导致数据迁移成本高昂3、可携带的数据范围尚存争议 数据可携带…

蓝桥每日打卡--分考场

#蓝桥#JAVA#分考场 题目描述 n个人参加某项特殊考试。 为了公平&#xff0c;要求任何两个认识的人不能分在同一个考场。 求是少需要分几个考场才能满足条件。 输入描述 输入格式&#xff1a; 第一行&#xff0c;一个整数n(1≤n≤100)&#xff0c;表示参加考试的人数。 …

RMAN备份bug-审计日志暴涨(select action from gv$session)

问题概述 /oracle 文件系统使用率过大&#xff0c;经过检查是审计日志过大,/oracle 目录 197G 审计日志占用70G&#xff0c;每6个小时产生大量审计日志&#xff0c;日志内容全是select action from gv$session &#xff0c;猜测可能跟备份有关&#xff0c; $>df -h /oracle…

在Blender中给SP分纹理组

在Blender中怎么分SP的纹理组/纹理集 其实纹理组就是材质 把同一组的材质分给同一组的模型 导入到sp里面自然就是同一个纹理组 把模型导入SP之后 就自动分好了

Nuxt:Nuxt3框架中onBeforeMount函数 和onBeforeRouteUpdate函数区别介绍 【超详细!】

提示&#xff1a;在 Nuxt3 中&#xff0c;onBeforeMount 和 onBeforeRouteUpdate 是两个不同场景下使用的钩子函数&#xff0c;分别对应 Vue 组件生命周期 和 路由导航守卫。以下是它们的详细解释和对比&#xff1a; 文章目录 一、onBeforeMount&#xff08;Vue 生命周期钩子&a…

华为 Open Gauss 数据库在 Spring Boot 中使用 Flyway

db-migration&#xff1a;Flyway、Liquibase 扩展支持达梦&#xff08;DM&#xff09;、南大通用&#xff08;GBase 8s&#xff09;、OpenGauss 等国产数据库。部分数据库直接支持 Flowable 工作流。 开源代码仓库 Github&#xff1a;https://github.com/mengweijin/db-migrat…

java 查找两个集合的交集部分数据

利用了Java 8的Stream API&#xff0c;代码简洁且效率高 import java.util.stream.Collectors; import java.util.List; import java.util.HashSet; import java.util.Set;public class ListIntersection {public static List<Long> findIntersection(List<Long> …

双足机器狗开发:Rider - Pi

双足机器狗开发:Rider - Pi https://github.com/YahboomTechnology/Rider-Pi-Robot 项目介绍 Rider - Pi是一款为开发者、教育工作者和机器人爱好者设计的桌面双轮腿式机器人,它基于树莓派CM4核心模块构建,具备多种先进功能和特点: 硬件特性 核心模块:采用树莓派CM4核…

Android12 添加开机铃声

系统默认是没有播放开机铃声的功能&#xff0c;MTK有一套自己的开机铃声处理逻辑&#xff0c;代码在/vendor/mediatek/proprietary/operator/frameworks/bootanimation/MtkBootanimation下&#xff0c;但是在10之后MTK就不在维护这部分代码了。直接使用会有很多编译报错&#x…

3.6V-30V宽压输入降压同步IC内置MOS,电流4A/5A/6A,可以满足汽车应急电源,BMS电池,电池组USB口输出等储能应用

今天给大家介绍一下这三款产品&#xff0c;分别是CJ92340,输入电压4.5V-30V&#xff0c;输出可调&#xff0c;电流负载能力可达4A&#xff0c;频率350KHZ。CJ92350,输入电压3.6V-30V&#xff0c;输出可调&#xff0c;频率可调&#xff0c;带载能力达5A。CJ92360,输入电压3.6V-3…

代码随想录算法训练营第35天 | 01背包问题二维、01背包问题一维、416. 分割等和子集

一、01背包问题二维 二维数组&#xff0c;一维为物品&#xff0c;二维为背包重量 import java.util.Scanner;public class Main{public static void main(String[] args){Scanner scanner new Scanner(System.in);int n scanner.nextInt();int bag scanner.nextInt();int[…

010---基于Verilog HDL的分频器设计

文章目录 摘要一、时序图二、程序设计2.1 rtl2.2 tb 三、仿真分析四、实用性 摘要 文章为学习记录。绘制时序图&#xff0c;编码。通过修改分频值参数&#xff0c;实现一定范围分频值内的任意分频器设计。 一、时序图 二、程序设计 2.1 rtl module divider #(parameter D…

维度建模事实表技术基础解析(以电商场景为例)

维度建模事实表技术基础解析(以电商场景为例) 1. 事实表结构 定义:事实表是维度建模的核心,由外键(关联维度表)、度量值(可量化的业务指标)及退化维度(冗余的维度属性)组成。其本质是记录业务过程中的度量事件,例如电商订单金额、商品库存量等。 场景识别:适用于…

Redis 主从复制、哨兵与集群的关系及工作原理详解

一、核心概念与关系 Redis 的 主从复制、哨兵&#xff08;Sentinel&#xff09; 和 集群&#xff08;Cluster&#xff09; 是逐步演进的高可用与分布式解决方案&#xff0c;三者关系如下&#xff1a; 主从复制&#xff1a;数据冗余与读写分离的基础。 哨兵&#xff1a;在主从…

确认机制的分类及其区别与联系探讨

在传输控制中&#xff0c;确认机制&#xff08;ACK 机制&#xff09;作为反馈模块在实现拥塞控制、丢包恢复和状态监测等功能中起到了至关重要的作用。今天我将基于之前发表的论文研究成果&#xff0c;对确认机制的分类进行系统梳理&#xff0c;并讨论各类机制之间的区别与联系…

115 道 MySQL 面试题,从简单到深入!

1. 什么是数据库事务&#xff1f; 数据库事务是一个作为单个逻辑工作单元执行的一系列操作。事务具有ACID属性&#xff0c;即原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xf…

Linux - 网络套接字

一、网络编程 1&#xff09;地址结构 1. IP地址结构 struct in_addr&#xff1a;是用于表示 IPv4 地址 的结构体&#xff0c;定义在头文件 <netinet/in.h> 中。它的主要作用是存储一个 32 位的 IPv4 地址&#xff0c;通常与 struct sockaddr_in 一起使用。 struct in_a…

程序员学商务英语之Visiting the Factory

Dialogue-1 Arranging a Visit安排参观 I was wondering if you would / could lend me a million bucks, you know, I’m trying to start / run my own business. 我想知道你是否能够借给我一百万美金&#xff0c;你知道&#xff0c;我正在创业。 Take off your tie befor…