web-dev-qa-db-ja.com

Spring 3.2の戻り値型がFutureの@Asyncタスク

戻り値の型がFutureであるSpring @Asyncタスクを実装しようとしていますが、適切に実行する方法がわかりません。

  1. そうすることで何が得られますか?タスクを制御して、停止して実行できるようになりますか?
  2. それを行う方法についてのリファレンス実装はありますか? springsourceは何も提供しません。

[〜#〜]編集[〜#〜]

春の源と春の参照マニュアルから:

値を返すメソッドでさえ非同期に呼び出すことができます。ただし、そのようなメソッドには、Future型の戻り値が必要です。これは依然として非同期実行の利点を提供するため、呼び出し側はそのFutureでget()を呼び出す前に他のタスクを実行できます。

そしてそれはそのような例を与えます:

@Async
Future<String> returnSomething(int i) {
// this will be executed asynchronously
}

これを正しく実装するにはどうすればよいですか?

17
engma

チェックアウト このブログ投稿

@Asyncを使用すると、メソッド内で非同期に計算を実行できます。つまり、(SpringマネージドBeanで)呼び出された場合、コントロールはすぐに呼び出し元に返され、メソッドのコードは別のスレッドで実行されます。呼び出し元は、実行中の計算にバインドされているFutureオブジェクトを受け取り、それを使用して計算が実行されているかどうかを確認したり、結果を待つことができます。

このようなメソッドの作成は簡単です。ブログ投稿に示されているように、@Asyncで注釈を付け、結果をAsyncResultでラップします。

24
Petr Pudlák

これをチェックしてください ブログ投稿

重要な構成は次のとおりです。

  1. SpringマネージドBeanメソッドの@Async
  2. Spring config xmlで非同期を有効にするには、次を定義します:

        <!--  Enables the detection of @Async and @Scheduled annotations on any Spring-managed object. -->
            <task:annotation-driven/>
    

    SimpleAsyncTaskExecutorがデフォルトで使用されます。

応答をFuture <>オブジェクトでラップする

例:

  @Async
    public Future<PublishAndReturnDocumentResult> generateDocument(FooBarBean bean) {  
//do some logic  
 return new AsyncResult<PublishAndReturnDocumentResult>(result);


}

次に、結果が完了したかどうかを確認するか(result.isDone())、応答を取得するまで待機します。result.get()

6
shane lee

ExecutorServiceはCallableをスケジュールし、Futureオブジェクトを返すことができます。 Futureは、使用可能になったときに結果を含むプレースホルダーです。結果があるかどうかを確認したり、タスクをキャンセルしたり、結果をブロックして待機したりできます。 Futureは、タスクからオブジェクト/値を期待している場合にのみ役立ちます。

Future呼び出しを行う正しい方法は次のとおりです。

Future<Integer> futureEvenNumber = executorService.submit(new NextEvenNumberFinder(10000));

// Do something.

try {
   Integer nextEvenNumber = futureEvenNumber.get();
} catch (ExecutionException e) {
   System.err.println("NextEvenNumberFinder threw exception: " + e.getCause());
}

NextEvenNumberFinderクラス:

public class NextEvenNumberFinder implements Callable<Integer> {
private int number;

public NextEvenNumberFinder(int number) { this.number = number; }

@Override
public Integer call() throws Exception {
    for (;;)
        if (isEvenNumber(++number)) return number;
}

}

Spring統合リファレンスマニュアル: http://static.springsource.org/spring-integration/reference/htmlsingle/

2
manjunath