戻り値の型がFutureであるSpring @Asyncタスクを実装しようとしていますが、適切に実行する方法がわかりません。
[〜#〜]編集[〜#〜]
春の源と春の参照マニュアルから:
値を返すメソッドでさえ非同期に呼び出すことができます。ただし、そのようなメソッドには、Future型の戻り値が必要です。これは依然として非同期実行の利点を提供するため、呼び出し側はそのFutureでget()を呼び出す前に他のタスクを実行できます。
そしてそれはそのような例を与えます:
@Async
Future<String> returnSomething(int i) {
// this will be executed asynchronously
}
これを正しく実装するにはどうすればよいですか?
チェックアウト このブログ投稿 。
@Async
を使用すると、メソッド内で非同期に計算を実行できます。つまり、(SpringマネージドBeanで)呼び出された場合、コントロールはすぐに呼び出し元に返され、メソッドのコードは別のスレッドで実行されます。呼び出し元は、実行中の計算にバインドされているFuture
オブジェクトを受け取り、それを使用して計算が実行されているかどうかを確認したり、結果を待つことができます。
このようなメソッドの作成は簡単です。ブログ投稿に示されているように、@Async
で注釈を付け、結果をAsyncResult
でラップします。
これをチェックしてください ブログ投稿
重要な構成は次のとおりです。
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()
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/