vertx常用方法示例

一、多个回调如何避免回调地域

方法:使用compose与Future

示例1:按顺序执行里面的回调方法
//回调方法1
private Future<boolean> getStatus1(String id) {
    return Future.future(f -> {
        f.complete(true);
    });
}
//回调方法2
private Future<boolean> getStatus2(boolean id) {
    return Future.future(f -> {
        f.complete(false);
    });
}

Future.<Void>succeededFuture()
.compose(v1 -> {
    getStatus1("1")
})
.compose(v2 -> {
    //现在这个v2 就代表getStatus1方法的返回值
    getStatus1(v2)
}).onComplete(a -> {
    //现在这个a 值为 false
    if (a.succeeded()) {
        //end
    }else{
        //end
    }
})
示例2: CompositeFuture 顺序执行/无序执行
//回调方法1
private Future<boolean> getStatus1(String id) {
    return Future.future(f -> {
        f.complete(true);
    });
}
//回调方法2
private Future<boolean> getStatus2(boolean id) {
    return Future.future(f -> {
        f.complete(false);
    });
}

List<Future> futures = new ArrayList<Future>(2);
futures.add(getStatus1("1"));
futures.add(getStatus1(true));
//join代表异步并发执行
//all代表按顺序执行,先执行
CompositeFuture.join(futures).onComplete(ar -> {
   if(ar.succeeded()) {
       CompositeFuture res = ar.result();
       boolean b1 = res.resultAt(0);//true
       boolean b2 = res.resultAt(1);//false
   }else{
       //error
   }
});


1. CompositeFuture.all()
完成条件: 只有当所有包含在 CompositeFuture 中的 Future 都成功完成时,CompositeFuture.all() 才会成功。
失败条件: 如果其中任何一个 Future 失败,CompositeFuture.all() 就会立即失败。此时,其他尚未完成的 Future 仍会继续执行,但它们的成功或失败将不再影响 CompositeFuture.all() 的最终状态(因为它已经失败了)。
结果: 成功时,CompositeFuture.all() 的结果将是一个 List,其中包含所有原始 Future 的结果(按添加顺序)。失败时,其结果是导致失败的那个 Future 的失败原因。
适用场景: 当你需要确保所有依赖项都已准备就绪,或者所有子任务都已成功执行才能继续下一步操作时,all() 是理想选择。例如,加载一个页面需要同时从多个微服务获取数据,所有数据都获取成功后才能渲染页面。

2. CompositeFuture.any()
完成条件: 当包含在 CompositeFuture 中的任意一个 Future 成功完成时,CompositeFuture.any() 就会成功。
失败条件: 只有当所有包含在 CompositeFuture 中的 Future 都失败时,CompositeFuture.any() 才会失败。
结果: 成功时,CompositeFuture.any() 的结果将是第一个成功完成的 Future 的结果。失败时,其结果是最后一个导致失败的 Future 的失败原因。
适用场景: 当你只需要至少一个操作成功即可继续时。例如,从多个备份服务器中获取数据,只要其中一个返回了数据即可。或者,尝试从多个不同的API获取相同类型的数据,只要其中一个成功就足够了。

3. CompositeFuture.join()
完成条件: 无论包含在 CompositeFuture 中的 Future 是成功还是失败,只要所有 Future 都完成(无论成功或失败),CompositeFuture.join() 就会成功。
失败条件: CompositeFuture.join() 永远不会失败(它自己的 Future 不会是 failed 状态)。它总是在所有子 Future 完成后进入 succeeded 状态。
结果: CompositeFuture.join() 的结果是一个 List。这个 List 的每个元素都是对应原始 Future 的结果。如果某个原始 Future 失败了,那么在 CompositeFuture.join().result().list() 中,对应位置上的 Future 对象会是 failed 状态。你需要迭代这个列表,并检查每个 Future 是否成功或失败。
适用场景: 当你需要知道所有异步操作的最终状态(无论成功或失败),并希望在它们全部结束后进行汇总处理时。例如,你启动了多个数据清理任务,即使某些任务失败了,你仍然需要知道所有任务是否已尝试完成,并查看它们的各自结果。

二.执行需要阻塞(io)的操作


vertx.executeBlocking(f -> {
    f.complete(res);
});

三.执行定时任务

public void start(Promise<Void> startFuture) {
    vertx.setPeriodic(3600 * 500, keys -> {
         //半小时更新一次
         getSetKeys();
    });
}

四.全局的安全的异步map

private static AsyncMap<Object, Object> timeline = null;

//初始化
vertx.sharedData().getAsyncMap("Timeline", resultHandler ->{
     timeline = resultHandler.result();
});

//使用
timeline.get(id, resultHandler -> {
    JsonObject vinfo = (JsonObject) resultHandler.result();
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值