如何确保来自EJB 3.1方法的@Asynchronous方法抛出的异常不会被Future默默地吃掉?
我知道可以使用Future.get方法来检索异常但它会等到计算完成,如果没有异常发生就会出现问题,你必须等到计算结束。
(更新)
情景非常简单。无状态EJB使用@Asynchronous注释公开其方法,主要用于@Local。 AS是JBoss。在计算过程中,可能会发生RuntimeException。如果作业完成,客户可能会或可能不想轮询,但在所有情况下,他们都应该知道是否发生了异常。 解决方法可以使用某种回调,但我感兴趣的是是否有任何现成的解决方案可用。
答案 0 :(得分:1)
如果没有可用的结果(计算没有完成),您是否考虑在给定时间后调用Future#get(timeout, timeUnit)来返回控件? 您还可以在Future#get()之前调用Future#isDone()以了解处理是否完成。
无论哪种方式,你仍然需要调用Future#get( - )来了解发生了什么,并确保不会吞下异常。
HTH。
答案 1 :(得分:0)
您的问题有解决方案。 countdownlatch的实现方式是通知调用线程未完成的任务数量。 here是使用countdownlatch的热门示例。因此,实现一个小型同步类,并在提交时向所有可调用对象添加实例。这应该作为回调。
答案 2 :(得分:0)
如果您可以访问EJB容器的配置并且可以设置执行程序,那么您可以使用Guava的addCallback方法。此方法需要com.google.common.util.concurrent.ListenableFuture
而不是普通方法。通过将实例的执行者设置为ListeningExecutorService
,您将获得此类未来。 Guava提供factory method用于将每个ExecutorService装饰为ListeningExecutorService,因此您可以自由使用您事先拥有的任何ExecutorService。