我认为我误解了Java ee异步方法调用。我正在遵循此官员tutorial的想法。对于void方法,这很好,但是我希望我的异步方法返回一个值:
@Asynchronous
public Future<String> processPayment(Order order) {
...
String status = ...;
return new AsyncResult<String>(status);
}
我在后台有许多这样长时间运行的任务,因此我收集了List<Future<String>>
并遍历它们以检查任务是否完成。我通过
for(Future<String> future: listOfFutures) {
if(future.isDone())
// do something
}
但是调用方法IllegalStateException:"Object does not represent an acutal Future"
时,代码以AsyncResult.isDone()
失败。
嗯,然后我读了this,这让我感到非常困惑:官方教程说“ Use AsyncResult.isDone()”检查异步方法的状态,而官方javadoc说“不敢使用AsyncResult.isDone()“] ..
我知道我可以将FutureTask<T>
与Callable<T>
一起使用,但这是Java的一部分。
您能否解释一下是否可以使用java ee异步方法调用
?谢谢!
P.S。我正在使用Glassfish 3.1.2和EJB 3.1]
我认为我误解了Java ee异步方法调用。我正在遵循此官方教程中的想法。对于void方法,这很好,但是我希望我的异步方法返回一个值:@ ...
因此,您的问题是“是否可以使用java ee异步方法调用?”答案是是
如果使用Spring Framework,请使用
@@ Holger在某种意义上为我指明了正确的方向:在这种情况下,我的问题是Future
的实现,AsyncResult
。事实证明这很有趣。我查看了AsyncResult
类代码,这就是我看到的内容: