2

我不明白 AsyncResult 类的想法。从教程中我了解到它就像 FutureTask 类一样工作(但 AsyncResult 是可序列化的,因此可以发送到本地或远程客户端)。但是,文档说不应调用此类的方法,因此我只能创建并返回此类的实例:

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

那么客户端会得到什么样的对象呢?

我可以写吗

@Asynchronous
public  AsyncResult<String> processPayment...

?.

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

编辑: 我在这个线程中找到了答案。

4

1 回答 1

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)
   }

}

当然,如果容器尚未开始方法调用(即异步调用仍在进程队列中),cancel(false)则应取消调用(将其从队列中删除),否则应指定cancel(true)并检查SessionContext.wasCancelled最终处理循环PaymentProcessor.processPayment

于 2012-11-30T18:07:01.587 回答