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

Quarkus Reactive with Panache:批量更新Equipment quantity问题求助

解决Reactive Quarkus Panache异步更新Equipment数量的问题

你的核心问题是直接同步访问异步操作的结果——getQuantity返回的Uni<FormEquipment>是异步对象,不能直接取fe.quantity,必须通过Reactive API的操作符处理异步流程。

以下是修正后的代码:

import io.smallrye.mutiny.Uni;
import java.util.List;
import java.util.stream.Collectors;

public Uni<List<Form>> listAll(Integer page, Integer size) {
    PanacheQuery<Form> query = Form.<Form>findAll(Sort.descending("idForm"));

    if (page != null && size != null) {
        query = query.page(Page.of(page, size));
    }

    // 先获取Form列表,再异步处理每个Form的Equipment
    return query.list()
            .flatMap(formList -> {
                // 将每个Form的处理转换为Uni<Form>,等待所有处理完成后汇总
                List<Uni<Form>> processedForms = formList.stream()
                        .map(this::processFormEquipment)
                        .collect(Collectors.toList());

                // 合并所有异步处理结果,返回最终的Form列表
                return Uni.combine().all().unis(processedForms)
                        .combinedWith(results -> results.stream().map(r -> (Form) r).collect(Collectors.toList()));
            });
}

private Uni<Form> processFormEquipment(Form form) {
    // 过滤出需要更新数量的output类型Equipment
    List<Uni<Void>> updateOperations = form.formCollection.stream()
            .filter(equipment -> "output".equals(equipment.type))
            .map(equipment -> getQuantity(form.idForm, equipment.idEquipment)
                    .onItem().transform(fe -> {
                        // 更新Equipment的quantity
                        equipment.quantity = fe.getQuantity(); // 假设FormEquipment有getQuantity()方法
                        return null;
                    }))
            .collect(Collectors.toList());

    // 等待当前Form下所有Equipment的更新操作完成,返回原Form
    return Uni.combine().all().unis(updateOperations)
            .combinedWith(v -> form);
}

关键说明:

  • 用flatMap替代transform:transform是同步转换逻辑,无法等待异步的getQuantity执行完成,flatMap适合处理需要异步后续操作的场景。
  • 拆分处理逻辑:将单个Form的Equipment更新逻辑拆到processFormEquipment方法,让代码结构更清晰。
  • 合并异步任务:通过Uni.combine().all().unis()等待所有Equipment的更新操作完成,确保所有异步任务执行完毕后再返回最终结果。
  • 精准过滤:仅对type == "output"的Equipment执行数量更新,匹配你的需求。

内容的提问来源于stack exchange,提问作者dkoci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:37:39