【问题标题】:How to call independent functions parallel and throw exception if one fails using CompletableFuture如果使用 CompletableFuture 失败,如何并行调用独立函数并抛出异常
【发布时间】:2021-06-11 20:01:02
【问题描述】:

我正在尝试做类似的事情

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(),然后在 Futures 上使用 get 并在 Optional 为空时执行上述抛出错误的逻辑?

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

【问题讨论】:

  • This answer 可能会提供您正在寻找的内容。
  • 如果回答了您的问题,您可以将答案标记为已接受。

标签: java multithreading parallel-processing future completable-future


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2013-10-16
    • 2018-08-08
    • 1970-01-01
    • 2018-10-23
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多