可以将AsyncResult视为可序列化的FutureTask吗?

时间:2012-04-25 15:11:57

标签: java-ee java-ee-6

我不了解AsyncResult类的想法。 从tutorial我了解到它的工作方式与FutureTask类相同(但AsyncResult是可序列化的,因此可以发送到本地或远程客户端)。 但是,doc表示不应该调用此类的方法,因此我只能创建并返回此类的实例:

@Asynchronous
public Future<String> processPayment(Order order) throws PaymentException {
  ...
  String status = ...;
  return new AsyncResult<String>(status);
}

那么客户会获得什么样的对象?

我可以写

吗?
@Asynchronous
public  AsyncResult<String> processPayment...

在调用AsyncResult的/ Future的cancel(false)方法之后容器会做什么来取消异步任务吗?

修改 我在thread找到了答案。

1 个答案:

答案 0 :(得分:0)

您可以在AsyncResult类文档中找到基本原理:

  

请注意,此对象不会传递给客户端。它只是一个   为容器提供结果值的便利性。   因此,它的实例方法都不应该被调用   应用

使用第一个代码段中定义的(正确)签名,客户端将收到一个简单的Future,如下所示:

@Singleton
public class AsyncClient{
   @Inject PaymentProcessor proc;
   public String invokePaymentProcessor(Order order){
         Future<String> result=proc.processPayment(order);
         // should not block.... the container instantiates a Future and 
         // returns it immediately
         return result.get(); // gets the string (blocks until received)
   }

}

当然,如果容器尚未开始方法调用(即异步调用仍在processig队列中),cancel(false)应取消调用(将其从队列中删除),否则应指定{{ 1}}并在cancel(true)

的最终处理循环中检查SessionContext.wasCancelled