Quarkus中如何使用Uni.createFrom()执行多参数异步方法?
在Quarkus中执行带多参数的异步方法
要在Quarkus中异步执行带多参数的worker方法,你可以利用Uni.createFrom()将方法调用包装为响应式任务,通过订阅触发异步执行。以下是修改后的完整代码:
修改后的WorkA类
import io.smallrye.mutiny.Uni; import jakarta.enterprise.context.ApplicationScoped; import java.util.List; import java.util.UUID; import java.util.logging.Logger; @ApplicationScoped public class WorkA implements Work { private static final Logger log = Logger.getLogger(WorkA.class); @Override public void doWork() { // 准备worker方法所需的示例参数 UUID uuid = UUID.randomUUID(); Integer one = 1; List<String> listExample = List.of("示例1", "示例2"); // 用Uni.createFrom()包装并异步执行worker逻辑 Uni.createFrom().item(() -> { try { // 等待worker方法执行完成 worker(uuid, one, listExample).await().indefinitely(); return null; } catch (Exception e) { log.severe("执行worker任务出错: " + e.getMessage()); throw e; } }).subscribe().with( ignored -> {}, // 任务成功完成时的回调(此处无需处理) error -> log.severe("异步执行失败: " + error.getMessage()) ); } private Uni<Void> worker(UUID uuid, Integer one, List<String> listExample) { log.info("开始任务: " + uuid); try { // 修正原代码的括号问题,确保随机休眠时间生效 Thread.sleep((long) (Math.random() * 1000)); } catch (InterruptedException ex) { log.info("无法完成任务: " + uuid); throw new RuntimeException(ex); } log.info("完成任务: {}.", uuid); return Uni.createFrom().voidItem(); } }
修改后的StartWork类
import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @ApplicationScoped public class StartWork { @Inject Work work; public void startWork() { work.doWork(); System.out.println("我不关心任务何时完成或是否完成,只要它已经启动就行。"); } }
关键说明
- 参数准备:在
doWork中生成或传入worker需要的所有参数(UUID、Integer、List)。 - Uni包装执行:通过
Uni.createFrom().item()创建响应式任务,在Supplier内部调用worker并等待其执行完毕。 - 异步触发:调用
subscribe()订阅该Uni,任务会在后台线程异步执行,不会阻塞当前主线程。 - 错误处理:订阅时传入错误回调,捕获并记录异步执行中的异常。
- 修正原代码问题:修复了
List<Strings>的泛型错误、work.do()的方法名错误,以及Thread.sleep的计算逻辑错误。
内容的提问来源于stack exchange,提问作者Marcio Jota Coelho
相关产品推荐
相关产品推荐

