未来<v>和例外</v>

时间:2011-10-07 15:45:07

标签: java java-ee ejb-3.1

如何确保来自EJB 3.1方法的@Asynchronous方法抛出的异常不会被Future默默地吃掉?
我知道可以使用Future.get方法来检索异常但它会等到计算完成,如果没有异常发生就会出现问题,你必须等到计算结束。

(更新)

情景非常简单。无状态EJB使用@Asynchronous注释公开其方法,主要用于@Local。 AS是JBoss。在计算过程中,可能会发生RuntimeException。如果作业完成,客户可能会或可能不想轮询,但在所有情况下,他们都应该知道是否发生了异常。 解决方法可以使用某种回调,但我感兴趣的是是否有任何现成的解决方案可用。

3 个答案:

答案 0 :(得分:1)

如果没有可用的结果(计算没有完成),您是否考虑在给定时间后调用Future#get(timeout, timeUnit)来返回控件? 您还可以在Future#get()之前调用Future#isDone()以了解处理是否完成。

无论哪种方式,你仍然需要调用Future#get( - )来了解发生了什么,并确保不会吞下异常。

HTH。

答案 1 :(得分:0)

您的问题有解决方案。 countdownlatch的实现方式是通知调用线程未完成的任务数量。 here是使用countdownlatch的热门示例。因此,实现一个小型同步类,并在提交时向所有可调用对象添加实例。这应该作为回调。

答案 2 :(得分:0)

如果您可以访问EJB容器的配置并且可以设置执行程序,那么您可以使用GuavaaddCallback方法。此方法需要com.google.common.util.concurrent.ListenableFuture而不是普通方法。通过将实例的执行者设置为ListeningExecutorService,您将获得此类未来。 Guava提供factory method用于将每个ExecutorService装饰为ListeningExecutorService,因此您可以自由使用您事先拥有的任何ExecutorService。