vertx 学习之Future

本文介绍了Vert.x中并发和顺序执行任务的方法。通过CompositeFuture.all实现多个Future的并发组合执行,一旦所有Future都成功则返回成功Future;利用compose进行Future的顺序组合执行,即使其中一个步骤失败也会标记最终Future为失败。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、并发组合执行。CompositeFuture.all 接受多个future参数(最多6个);当所有的future都成功了,就返回成功的future,否则只要有一个失败就会返回失败(failed)的future:


			Future<JsonObject> fut1 = Future.future();
			Future<JsonObject> fut2 = Future.future();
			Future<JsonObject> fut3 = Future.future();
			Future<JsonObject> fut4 = Future.future();
			Future<JsonObject> fut5 = Future.future();
			Future<JsonObject> fut6 = Future.future();
            //阻塞代码以及在阻塞代码执行返回异步结果处理程序来完成的,开启一个线程异步执行
			vertx.executeBlocking(fut -> {
                 //内容
                fut1.complete(new JsonObject());
				fut.complete();
			}, false, null);
			vertx.executeBlocking(fut -> {
		        //内容
                fut2.complete(new JsonObject());
				fut.complete();
			}, false, null);
			vertx.executeBlocking(fut -> {
				//内容
                fut3.complete(new JsonObject());
			    fut.complete();
			}, false, null);
           vertx.executeBlocking(fut -> {
        	  //内容
               fut4.complete(new JsonObject());
        	   fut.complete();
           }, false, null);
           vertx.executeBlocking(fut -> {
        	   //内容
            fut5.complete(new JsonObject());
		    fut.complete();
			}, false, null);
           vertx.executeBlocking(fut -> {
                //内容
               fut6.complete(new JsonObject());
   		    fut.complete();
			}, false, null);
            //等所有的都结束后,合并在一起统一输出
			CompositeFuture.all(fut1,fut2,fut3,fut4,fut5,fut6).setHandler(ar -> {
				  if (ar.succeeded()) {
					  JsonObject r0 = ar.result().resultAt(0);
					  JsonObject r1 = ar.result().resultAt(1);
					  JsonObject r2 = ar.result().resultAt(2);
					  JsonObject r3 = ar.result().resultAt(3);
					  JsonObject r4 = ar.result().resultAt(4);
					  JsonObject r5 = ar.result().resultAt(5);
					 future.complete(r0.mergeIn(r1.mergeIn(r2.mergeIn(r3.mergeIn(r4.mergeIn(r5))))));
				  }else{
					 future.complete(new JsonObject());
				  }
			});
		

二、顺序组合执行。 compose 可以使用链的方式设置组合future(因此这种方式叫顺序组合)。

在这个的例子中,这3个操作都是链式的:

fut1   fut2     startFuture 

当这3个步骤都成功了,最终的future (startFuture)就成功了。然而,如果其中的一个步骤失败了,最终的future并也是失败的。

 

FileSystem fs = vertx.fileSystem();
Future<Void> startFuture = Future.future();
 
Future<Void fut1 = Future.future();
fs.createFile("/foo", fut1.completer());

fut1.compose(v -> {
   // What the file is created (fut1), execute this:
   Future<Void> fut2 = Future.future();
   fs.writeFile("/foo", Buffer.buffer(), fut2.complter());
   return fut2;
}).compose(v -> {
    // When the file is written (fut2), execute this:
    fs.remove("/foo", "/bar", startFuture.completer());
}, 
// mark startFuture it as failed if any step fails.
startFuture);

https://blog.youkuaiyun.com/u011054333/article/details/76595444//vertx中http的讲解,webclient的使用

点击打开链接

 

<think>嗯,用户询问了关于Vert.x Cache模块的信息,这需要结合Vert.x框架的特性来回答。根据引用[1],Vert.x是一个跨语言的异步应用框架,而Cache模块应该是其扩展功能之一。 用户可能正在评估是否要在项目中使用该模块,或者遇到了缓存相关的性能问题。考虑到Vert.x的异步特性,用户可能对高并发场景下的缓存实现特别关注。 从技术角度看,需要解释清楚几个关键点:首先说明vertx-cache是Vert.x生态中的缓存抽象层,其次要强调其异步非阻塞的核心特性。引用[2]提到的resilience4j-cache依赖给了我提示,说明它支持多种缓存实现。 在场景描述上,结合引用[3]提到的微服务治理能力和引用[4]的实时数仓案例,可以推断出适合推荐给用户的典型场景。特别要注意的是,由于Vert.x的多语言支持,需要提及它对Java/Kotlin等语言的通用性。 实现原理部分要突出事件循环模型,避免阻塞线程这个Vert.x的核心优势。示例代码选择Supplier缓存模式比较直观,但也要说明高级用法如过期策略的存在。 用户可能还会关心性能指标,但当前引用中没有具体数据,所以回答中保持谨慎,只提及"高性能"这个定性描述。最后生成的问题要覆盖配置、对比、失效策略等实用角度,特别是分布式场景这个企业级用户关心的重点。</think>Vert.x-Cache 是 Vert.x 框架提供的**异步、非阻塞的缓存抽象层**。它定义了一套通用的缓存操作接口,允许开发者使用统一的 API 与各种底层的缓存实现(如本地内存缓存或分布式缓存)进行交互,同时严格遵循 Vert.x 的核心原则——**非阻塞和异步**。 ### 核心作用与目标 1. **提供统一抽象接口:** 简化缓存集成,开发者无需关心底层缓存的具体实现细节(如 Ehcache、Infinispan、Hazelcast、Redis 等),只需使用 Vert.x-Cache 的 API。 2. **强制异步非阻塞:** 所有缓存操作(`get`, `put`, `remove` 等)都返回 `Future` 或接受 `Handler<AsyncResult>`,确保操作不会阻塞 Vert.x 的事件循环线程,这是构建高性能、高并发 Vert.x 应用的关键[^1]。 3. **提升可移植性:** 应用代码依赖的是 Vert.x-Cache API,更换底层缓存提供者通常只需修改配置或初始化代码,业务逻辑变动极小。 ### 典型应用场景 1. **高频数据访问加速:** 缓存数据库查询结果、外部 API 响应、计算结果等,显著减少 I/O 延迟和计算开销,提升响应速度。这在 Web 服务、API 网关中极其常见。 2. **会话管理 (Session Storage):** 缓存用户会话信息(如 Vert.x-Web 的 `ClusteredSessionStore` 可能使用 Vert.x-Cache 的分布式实现作为后端)。 3. **API 响应缓存/限流:** 缓存 API 响应以应对重复请求或作为限流策略的一部分。 4. **微服务架构:** 在基于 Vert.x 构建的微服务中,缓存服务间调用的结果或配置信息,减少跨服务调用开销[^3]。 5. **实时数据处理/数仓:** 在需要快速访问参考数据(如维度表)的实时数据处理管道中充当维表缓存[^4]。 6. **减少重复计算:** 缓存计算成本高的结果。 ### 工作原理 1. **API 抽象 (`Cache` 接口):** 定义了核心异步操作方法: * `Future<V> get(K key)`: 异步获取键对应的值。 * `Future<Void> put(K key, V value)`: 异步存储键值对。 * `Future<Void> put(K key, V value, long ttl)`: 异步存储键值对并设置生存时间 (Time-To-Live)。 * `Future<Boolean> remove(K key)`: 异步移除指定键的缓存项。 * `Future<Void> clear()`: 异步清空缓存。 * `Future<Integer> size()`: 异步获取缓存项数量(注意:分布式缓存中可能为近似值)。 2. **底层实现适配:** * Vert.x-Cache 本身是接口定义和抽象。 * **具体功能由实现该接口的模块提供**: * `vertx-cache`: 提供最基础的 `LocalCache`(基于 ConcurrentHashMap 的本地 JVM 缓存)。 * `vertx-infinispan` / `vertx-hazelcast` / `vertx-redis-client` (结合其缓存命令): 提供基于这些流行分布式缓存系统的实现,支持集群范围的数据共享和失效。 * *其他第三方或自定义实现*: 开发者可以实现 `Cache` 接口来适配其他缓存系统。 3. **异步执行:** * 当调用 `cache.get(key)` 时,请求被封装成一个任务。 * 如果底层是本地缓存,该任务通常由 Vert.x 的 Worker 线程池执行(避免阻塞 Event Loop),结果通过 `Future` 或回调返回。 * 如果底层是分布式缓存(如 Redis),则通过对应的异步客户端(如 Vert.x-Redis-Client)发起网络请求,客户端在收到响应后通过 `Future` 或回调返回结果。 * 整个过程**绝不阻塞** Vert.x 的 Event Loop 线程。 4. **缓存策略 (由底层实现):** * 缓存失效策略(TTL, TTI)通常由底层缓存库(如 Redis 的 `EXPIRE`,Infinispan 的配置)实现和管理。 * 缓存淘汰策略(LRU, LFU 等)也由底层缓存库配置控制。Vert.x-Cache API 主要提供 `put` 时设置 TTL 的能力。 ### 核心优势 * **Vert.x 生态无缝集成:** 天然支持异步编程模型 (`Future`, `Promise`),与 Vert.x Event Bus、Web Client 等组件协作流畅。 * **高性能:** 异步非阻塞特性是构建高吞吐量、低延迟应用的基础。 * **灵活性:** 支持从简单的单机内存缓存到强大的分布式缓存,按需选择。 * **简化开发:** 统一的 API 降低了学习和使用不同缓存技术的成本。 ### 简单示例 (概念性代码) ```java // 1. 创建缓存实例 (例如使用本地缓存) Cache<String, String> cache = CacheFactory.vertx().getOrCreateCache("myCache"); // 2. 异步存储数据 (带5秒TTL) cache.put("key1", "Hello Vert.x Cache!", 5000) .onSuccess(v -> System.out.println("Value stored successfully")) .onFailure(err -> System.err.println("Store failed: " + err.getMessage())); // 3. 异步获取数据 cache.get("key1") .onSuccess(value -> { if (value != null) { System.out.println("Retrieved value: " + value); } else { System.out.println("Value not found or expired"); } }) .onFailure(err -> System.err.println("Retrieval failed: " + err.getMessage())); ``` **总结:** Vert.x-Cache 是 Vert.x 框架中用于**异步、非阻塞缓存操作**的关键抽象。它通过统一的 API 屏蔽底层缓存差异,强制使用异步模式以保证 Vert.x 应用的高性能和高并发能力。它广泛应用于需要加速数据访问、管理会话状态、构建微服务和实时数据处理管道的场景中,是提升 Vert.x 应用响应速度和扩展性的重要工具[^1][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值