繁体   English   中英

如果使用 CompletableFuture 失败,如何并行调用独立函数并抛出异常

[英]How to call independent functions parallel and throw exception if one fails using CompletableFuture

我正在尝试做类似的事情

Optional<Order> orderDetails = orderRepository.findById(orderId);
if (orderDetails.isEmpty())
    throw new OrderNotFoundException("Order not found!");

Optional<User> UserDetails = userRepository.findById(userId);
if (UserDetails.isEmpty())
    throw new UserNotFoundException("User not found!");

List<OrderItem> ItemDetailsList = orderItemRepository.findByOrderIdOrderByItemIdAsc(orderId);

我想以非阻塞方式一起调用这三个服务方法,但是如果其中任何一个调用失败并且不继续进行,我想抛出错误。 如果以上都可行,则执行后面的逻辑。

我正在考虑使用allOff()然后使用 get on Futures 并在 Optional 为空时执行上述引发错误的逻辑?

有更好的方法吗? ,如果其中一个失败而其他仍在运行,则抛出错误并中止其他正在运行的任务。

CompletableFuture在这里的工作是错误的工具。 主要问题是您想要:

“...抛出错误并中止其他正在运行的任务”

如果您阅读CompletableFuture::cancel文档中的内容,您会看到:

mayInterruptIfRunning——这个值在这个实现中没有影响,因为中断不用于控制处理。

因此,即使您调用cancel ,这也不会中断您的任务,它们仍然会继续完成。 因此,您的基本要求无法满足。

有一种方法可以为您想要取消并关闭池的CompletableFuture创建自定义线程池, 例如此处 但这并非易事,您的线程需要正确响应中断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM