文章目录

  • 需要知道vert.x的基础知识,和vertx单侧方式
  • 初始化:
  • future完成(成功或者失败(异常))
  • 设置回调
  • 举例
  • tryComplete方法
  • map的使用
  • compose方法,最后讲
  • 源码

需要知道vert.x的基础知识,和vertx单侧方式

初始化:

package io.vertx.core;
直接看源码:

这几个方法是静态的方法,一个是传handler,一个成功返回,失败返回,用的比较多的就是直接初始化 Future.future();这时候返回的future是没有完成的,也没有处理器,比较灵活.

future完成(成功或者失败(异常))


就是对初始化的future进行complete或者fail操作,这时候future就是完成的.完成之后就要对返回的数据进行处理了,这时候就要设置回调方法了

设置回调

  @FluentFuture<T> setHandler(Handler<AsyncResult<T>> handler);

泛型是封装了返回的泛型的AsyncResult是异步结果,因为可能成功,可能失败,所以回调要进行判断一下,然后通过succeeded方法来判断成功怎么办,失败怎么办;

举例

写一个简单的例子:

@Testpublic void testsetHandler(TestContext context) {Async async = context.async();Future<String> future = Future.future();future.setHandler(r -> {if (r.succeeded()) {//成功执行String result = r.result();System.out.println("result is:" + result);}else {//失败执行Throwable cause = r.cause();System.out.println("异常:"+cause);}async.complete();});//异步执行其他操作,操作完成执行future.complete方法.asynchronousMethod(future);System.out.println("handler设置完成...");}private void asynchronousMethod(Future<String> f) {CompletableFuture.runAsync(() -> {System.out.println("asynchronousMethod...");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}f.complete("haha");});}

一般是先执行其他操作,然后在设置Handler,都是一样的…
回调的AsyncResult有成功还是失败,如果失败则应该fail(exception),这样在返回的时候我们也可以获取的到:

执行的结果:

tryComplete方法

tryComplete方法顾名思义,就是尝试成功,如果回调还没有执行完,然后被tryComplete执行了,那就返回true,如果,回调已经执行完了,那就返回false.这个比较简单,感觉使用的也少;

  @Testpublic void testTryComplete(TestContext context) {Async async = context.async();Future<String> future = Future.future();future.setHandler(r -> {if (r.succeeded()) {//成功执行String result = r.result();System.out.println("result is:" + result);} else {//失败执行Throwable cause = r.cause();System.out.println("异常:" + cause);}async.complete();});//异步执行其他操作,操作完成执行future.complete方法.asynchronousMethod(future);System.out.println("handler设置完成...");//不进行sleep,返回的就是ccc
//    try {//      TimeUnit.SECONDS.sleep(3);
//    } catch (InterruptedException e) {//      e.printStackTrace();
//    }boolean b = future.tryComplete("ccc");System.out.println(b);}

执行结果:

map的使用

map方法比较简单,就是返回新的数据类型, 举个例子,好比一开始返回的是haha,然后要返回haha + “aaa”;你懂我的意思,就是要对原先返回的进行处理一下在返回:可以是其他数据类型,为了测试简单,我们就使用String,返回也是:

 @Testpublic void testMap(TestContext context) {Async async = context.async();Future<String> future = Future.future();future.setHandler(r -> {if (r.succeeded()) {//成功执行String result = r.result();System.out.println("result is:" + result);} else {//失败执行Throwable cause = r.cause();System.out.println("异常:" + cause);}async.complete();});//异步执行其他操作,操作完成执行future.complete方法.asynchronousMethod(future);System.out.println("handler设置完成...");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}Future<String> map = future.map(x -> {System.out.println(x);return "fuction...return" + x;});map.setHandler(x -> {System.out.println("map result :" + x.result());async.complete();});}

执行的结果是:

这时候看到第一个handler是没有执行的,如果,我们使用map,尽量就不要设置handler了,因为我实在找不出理由,你想对返回结果进行转换还要进行处理,这样就会出现问题,如果,我们在执行map之前时间很长,那么两个handler都会执行了:

所以,使用map,感觉就可以直接在map里面进行统一处理即可;
map还要其他两个方法,也比较简单,就是直接返回一个新的数据类型,对原来的数据还没有进行处理;

mapEmpty返回的是null,mapV是返回的v,
源码:就是新建一个Future然后进行处理一下返回,比较简单;

compose方法,最后讲

compose方法应该相当于链式调用,我想在操作1执行完成之后执行操作2
第一种方式:
compose源码:

default <U> Future<U> compose(Handler<T> handler, Future<U> next) {setHandler(ar -> {if (ar.succeeded()) {try {handler.handle(ar.result());} catch (Throwable err) {if (next.isComplete()) {throw err;}next.fail(err);}} else {next.fail(ar.cause());}});return next;}

传了两个参数,第一个是执行compose的handler,第二个参数是下一个future,然后将下一个future返回回去,写个demo:

 @Testpublic void testCompose(TestContext context) {Future<String> f1 = Future.future();Future<Integer> f2 = Future.future();f1.complete("f1's result");//    f1.setHandler(x -> {//      System.out.println("f1 handler:" + x);
//      f2.complete(123);
//    });
//    f2.setHandler(x -> {//      System.out.println("f2 handler:" + x);
//    });f1.compose(r -> {System.out.println("f1 handler:" + r);f2.complete(123);}, f2).setHandler(r -> {System.out.println("f2 handler:" + r.result());});}

结果:

f1执行完,在f1的handler里面需要将f2给完成掉.
第二种componse源码:

default <U> Future<U> compose(Function<T, Future<U>> mapper) {if (mapper == null) {throw new NullPointerException();}Future<U> ret = Future.future();setHandler(ar -> {if (ar.succeeded()) {Future<U> apply;try {apply = mapper.apply(ar.result());} catch (Throwable e) {ret.fail(e);return;}apply.setHandler(ret);} else {ret.fail(ar.cause());}});return ret;}

写一个跟上面一样的测试:

@Testpublic void testCompose2(TestContext context) {Future<String> f1 = Future.future();f1.complete("f1's result");f1.compose(r -> {System.out.println("f1  hander :"+r);Future<String> f2 = Future.future();f2.complete("f2's result");//返回的f2,下一个componse的执行者return f2;}).compose(r -> {System.out.println("f2  hander :"+r);Future<String> f3 = Future.future();f3.complete("f3's result");//返回的f3,setHandlerreturn f3;}).setHandler(r -> {System.out.println("f3  hander :"+r);});}

执行结果:

compose实现方法太绕了,没怎么看得懂…个人理解,就是在compose方法里面相当于是执行回调方法,然后执行完成返回下一个要执行的future…可以看一下别哥们写的:
https://zhuanlan.zhihu.com/p/35980063

源码

package com.test;import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;import io.vertx.core.Future;
import io.vertx.core.Vertx;
import io.vertx.core.file.FileSystem;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.VertxUnitRunner;
import io.vertx.test.core.TestVerticle;import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;/*** @author* @Version 2020-04-19 14:09* @Version 1.0* @Description VertxTest*/
@RunWith(VertxUnitRunner.class)
public class VertxTest {private Vertx vertx;private FileSystem fs;@Beforepublic void setUp(TestContext context) {vertx = Vertx.vertx();fs = vertx.fileSystem();vertx.deployVerticle(new TestVerticle());}@Afterpublic void after(TestContext context) {System.out.println("after  ...");vertx.close(context.asyncAssertSuccess());}private void synchronousMethod(Future<String> f) {CompletableFuture.runAsync(() -> {System.out.println("asynchronousMethod...");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}f.complete("haha");});}private void asynchronousMethod(Future<String> f) {CompletableFuture.runAsync(() -> {System.out.println("asynchronousMethod...");try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}f.complete("haha");
//      f.fail(new NullPointerException("aa"));});}@Testpublic void testsetHandler(TestContext context) {Async async = context.async();Future<String> future = Future.future();future.setHandler(r -> {if (r.succeeded()) {//成功执行String result = r.result();System.out.println("result is:" + result);} else {//失败执行Throwable cause = r.cause();System.out.println("异常:" + cause);}async.complete();});//异步执行其他操作,操作完成执行future.complete方法.asynchronousMethod(future);System.out.println("handler设置完成...");}@Testpublic void testTryComplete(TestContext context) {Async async = context.async();Future<String> future = Future.future();future.setHandler(r -> {if (r.succeeded()) {//成功执行String result = r.result();System.out.println("result is:" + result);} else {//失败执行Throwable cause = r.cause();System.out.println("异常:" + cause);}async.complete();});//异步执行其他操作,操作完成执行future.complete方法.asynchronousMethod(future);System.out.println("handler设置完成...");//不进行sleep,返回的就是ccc
//    try {//      TimeUnit.SECONDS.sleep(3);
//    } catch (InterruptedException e) {//      e.printStackTrace();
//    }boolean b = future.tryComplete("ccc");System.out.println(b);}@Testpublic void testMap(TestContext context) {Async async = context.async();Future<String> future = Future.future();future.setHandler(r -> {if (r.succeeded()) {//成功执行String result = r.result();System.out.println("result is:" + result);} else {//失败执行Throwable cause = r.cause();System.out.println("异常:" + cause);}async.complete();});//异步执行其他操作,操作完成执行future.complete方法.asynchronousMethod(future);System.out.println("handler设置完成...");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}Future<Object> objectFuture = future.mapEmpty();System.out.println(objectFuture);Future<String> map = future.map(x -> {System.out.println(x);return "fuction...return" + x;});map.setHandler(x -> {System.out.println("map result :" + x.result());async.complete();});}//  public static void handleAddCollection(RoutingContext routingContext){//    Future<Void> futn=Future.future();
//    futn.setHandler(a->{//      System.out.println("4最后一步:");
//      sendData(routingContext,"ok");
//      return;
//    });
//    Future<UpdateResult> fut1 = Future.future();
//    JsonArray params=new JsonArray().add("123").add("测试标题").add("http://baidu.com").add("");
//    String sql="insert into mytable (userid,title,url,pic) values (?,?,?,?)";
//    myDBConnecton.updateWithParams(sql,params,fut1.completer());
//    fut1.compose(v-> {//      if(v.getUpdated()>0)System.out.println("2 插入成功了");
//      else System.out.println("2 插入失败了");
//      Future<ResultSet> fut2 = Future.future();
//      myDBConnecton.query("select * from mytable", fut2.completer());
//      return fut2;
//    }).compose(v -> {//      List<JsonObject> data=v.getRows();
//      System.out.println("3查询结果为:"+data.toString());
//      Future<Void> fut3 = Future.future();
//      myDBConnecton.updateWithParams(sql,params,fut1.completer());
//      futn.complete();
//    },futn);
//  }@Testpublic void testCompose(TestContext context) {Future<String> f1 = Future.future();Future<Integer> f2 = Future.future();f1.complete("f1's result");//    f1.setHandler(x -> {//      System.out.println("f1 handler:" + x);
//      f2.complete(123);
//    });
//    f2.setHandler(x -> {//      System.out.println("f2 handler:" + x);
//    });f1.compose(r -> {System.out.println("f1 handler:" + r);f2.complete(123);}, f2).setHandler(r -> {System.out.println("f2 handler:" + r.result());});}@Testpublic void testCompose2(TestContext context) {Future<String> f1 = Future.future();f1.complete("f1's result");f1.compose(r -> {System.out.println("f1  hander :"+r);Future<String> f2 = Future.future();f2.complete("f2's result");//返回的f2,下一个componse的执行者return f2;}).compose(r -> {System.out.println("f2  hander :"+r);Future<String> f3 = Future.future();f3.complete("f3's result");//返回的f3,setHandlerreturn f3;}).setHandler(r -> {System.out.println("f3  hander :"+r);});}@Testpublic void test2(TestContext context) {Async async = context.async();vertx.executeBlocking(future -> {// 调用一些需要耗费显著执行时间返回结果的阻塞式APItry {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}future.complete("complete...over...");}, res -> {System.out.println("The result is: " + res.result());async.complete();});}}

vert.x中future的简单使用相关推荐

  1. C++中Future和Promise的一种简单实现

    女主宣言 由于工作需求,笔者最近在阅读 Pulsar C++ 客户端的实现,发现该客户端虽然是基于 C++11 编写的,但却自己编写了 Future 和 Promise 类,随着阅读的深入,也体会到了 ...

  2. 中的listeners_C++中Future和Promise的一种简单实现

    女主宣言 由于工作需求,笔者最近在阅读 Pulsar C++ 客户端的实现,发现该客户端虽然是基于 C++11 编写的,但却自己编写了 Future 和 Promise 类,随着阅读的深入,也体会到了 ...

  3. Vert.x中EventBus中的使用

    注意:使用的是vert.x3.0 仅支持到java8当中有一些lambda表达式.如不明确请自补java8新特性. The Event Bus event bus 是vert.x的神经系统. 每个ve ...

  4. vert.x笔记:4.vert.x中调用spring服务

    evenbus事件总线介绍: 在介绍怎么在vert.x中集成spring服务前,我们要先简单介绍一下什么是vert.x的事件总线. eventbus是vert.x的神经总线,每个vert.x实例维护了 ...

  5. 基于vert.x与webSocket的简单聊天系统

    基于vert.x与webSocket的简单聊天系统 使用vert.x和webSocket的简单聊天实现 主要的verticle package com.zhku.analysis.service; / ...

  6. django中使用celery简单介绍

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 本章节我们重点在于实现,如何存储任务的结果. 我们将任务函数改为: from celery_demo.celery im ...

  7. python tkinter库、添加gui界面_使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)...

    使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二),创建一个,界面,布局,文件,路径 使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二) ...

  8. C及C++中typedef的简单使用指南

    C及C++中typedef的简单使用指南 又是在学数据结构的时候,发现了之前学习的知识遗忘很多,在发现对C/C++中关键字typedef的理解还是没有到位后,我翻阅了学C++用到的课本,又问了度娘,也 ...

  9. Keras之ML~P:基于Keras中建立的简单的二分类问题的神经网络模型(根据200个数据样本预测新的5个样本)——概率预测

    Keras之ML~P:基于Keras中建立的简单的二分类问题的神经网络模型(根据200个数据样本预测新的5个样本)--概率预测 目录 输出结果 核心代码 输出结果 核心代码 # -*- coding: ...

最新文章

  1. opengl版本发展史及各种概念的厘清
  2. 谈谈Java中的volatile
  3. Java集合,ConcurrentHashMap底层实现和原理(常用于并发编程)
  4. (仿头条APP项目)2.主界面按钮切换Fragment页面
  5. win7下设置无线上网
  6. python kill 进程,python 判断linux进程,并杀死进程的实现方法
  7. NanShan企业即时通讯开始写博客
  8. 单片机c语言实训例子基于mega16,基于AVR单片机的mega16内部EEPROM操作C语言程序设计...
  9. 编程基本功:以输入法为例,谈谈测试案例的设计
  10. Java获取名字首字母拼音及用户按名字拼音分组工具
  11. 26个字母与ASCII值对照表
  12. 有密码的压缩包怎么解密
  13. 移动硬盘的选择与购买
  14. 牛客网 水题 递推找规律
  15. 进入房间时如何使用SmartThings自动打开灯光
  16. 奇安信行业安全研究中心
  17. 《大天蓬》片尾升华,燃情!
  18. photoswipe 移动端PC端兼容图片相册预览
  19. ImageNet无监督学习最佳性能一次提升7%,媲美监督学习
  20. 2018年中小学计算机培训,2018年中小学教师全员培训资料.doc

热门文章

  1. 压裂支撑剂行业调研报告 - 市场现状分析与发展前景预测
  2. intel服务器e5系列,以后都没有Xeon E5/E7了,Intel正式发布Xeon Scalable系列处理器
  3. python dwg文件_Python将dwg文件转换为shapefi
  4. 一款开源 OA 办公自动化系统
  5. Oracle VM VirtualBox上配置新的Ubuntu20.04
  6. 手把手 | 事理图谱,下一代知识图谱
  7. 计算机的基础知识---位(bit)、字节(byte)、编码(Encoding)和大小端
  8. 双重游标的使用以及动态游标的使用
  9. 剑指offer:顺时针打印矩阵(java)
  10. 国企的判断标准是什么 怎么查企业是私企还是国企