You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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("我不关心任务何时完成或是否完成,只要它已经启动就行。");
    }
}

关键说明

  1. 参数准备:在doWork中生成或传入worker需要的所有参数(UUID、Integer、List)。
  2. Uni包装执行:通过Uni.createFrom().item()创建响应式任务,在Supplier内部调用worker并等待其执行完毕。
  3. 异步触发:调用subscribe()订阅该Uni,任务会在后台线程异步执行,不会阻塞当前主线程。
  4. 错误处理:订阅时传入错误回调,捕获并记录异步执行中的异常。
  5. 修正原代码问题:修复了List<Strings>的泛型错误、work.do()的方法名错误,以及Thread.sleep的计算逻辑错误。

内容的提问来源于stack exchange,提问作者Marcio Jota Coelho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:07:51