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
相关产品推荐
相关产品推荐

