EJB 异步方法的客户机编程模型
如 Enterprise JavaBeans (EJB) 3.1 规范中所述,您可以通过以下接口类型来调用 EJB 异步方法:本地业务、远程业务或无接口视图。不允许通过 EJB 2.1 客户机视图或 Web Service 视图进行调用。
EJB 异步方法的接口规范必须具有返回类型 void 或类型 java.util.concurrent.Future <V>。在接口上不支持其他返回类型。如 EJB 3.1 规范中所记录,Bean 实现方法必须具有相同的返回类型。
当您的应用程序不需要检查 EJB 异步方法调用的结果时,请使用返回类型为 void 的接口签名。相反,当您的应用程序需要检查 EJB 异步方法调用的结果时,请使用返回类型为 Future<V> 的接口。
除了考虑到是否检查结果外,客户机还必须准备好处理异常。如 EJB 3.1 规范中所述,如果容器无法分配所需的内部资源来调度要执行的异步方法,那么客户机将收到异常。 在这种情况下,客户机可假定异步方法不会运行。 同样,当异步方法在非客户机线程上运行时,也会发生异常。
要点:当异步方法的返回类型为 void 时,客户机没有检索异常信息的机制。在此情况下,EJB 容器将记录参考消息。但是,对于返回类型为 Future<V> 的异步方法,EJB 容器会将异常信息保存在 Future<V> 对象中。在这种情况下,与 Future<V> 对象相关联的 get 方法将生成异常 ExecutionException。客户机必须在 ExecutionException 上调用 getCause 方法以检索有关异常的详细信息。
客户机必须知道在调用 get 方法时,如果异步方法未完成运行,那么 Future<V> 对象上的 get 方法将阻止客户机线程。如果客户机不希望出现此行为,那么它们可以轮询 Future<V> 对象以通过定期调用 isDone 方法来确定完成异步方法的时间。
最后,客户机可以使用 Future<V> 对象来取消异步方法调用。如果您在异步方法调用等待运行时尝试取消该异步方法调用,那么该异步方法调用不会运行,并且具有 Future<V> 对象的其他交互将体现该取消操作。否则,如果您在异步方法开始运行之后尝试取消该异步方法,那么该异步方法将继续运行,但是 Bean 方法仍可以确定客户机已尝试取消该调用并使用特定于应用程序的返回值或异常作为响应。
另一种方法是让客户机使用包含超时参数的 get 方法。此 get 方法仅在指定的超时期限内等待结果。一旦 get 方法完成运行或超时到期(即使该方法尚未完成运行),就会返回到客户机。

请阅读“开发将调用 EJB 异步方法的客户机代码”的相关信息。