[英]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.