2

AsyncResultクラスのアイデアがわかりません。チュートリアルから、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)メソッドを呼び出した後、非同期タスクをキャンセルするために何かをしますか?

編集:私はこのスレッド で答えを見つけました。

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

}

確かに、コンテナがメソッド呼び出しを開始していない場合(つまり、非同期呼び出しがまだprocessigキューにある場合)、cancel(false)呼び出しをキャンセルする(キューから削除する)必要があります。そうでない場合は、の最終的な処理ループを指定cancel(true)してチェックインする必要があります。SessionContext.wasCancelledPaymentProcessor.processPayment

于 2012-11-30T18:07:01.587 に答える