web-dev-qa-db-ja.com

Spring @AsyncとCompleteableFutureを直接使用することにはどのような利点がありますか?

Spring Async を使用する利点と、自分でCompletableFutureを返すだけの利点は何ですか?

12

アプリケーションはコンテナによって管理されます。自分でThreadsを生成することはお勧めしませんので、コンテナにマネージドExecutorを注入させることができます。

@Service
class MyService {
  @Autowired
  private Executor executor;

  public CompletableFuture<?> compute() {
    return CompletableFuture.supplyAsync(() -> /* compute value */, executor);
  }
}
7
Flown

2つの間に「vs。」はありません。これらは補完的なテクノロジーです。

  • CompletableFutureは、非同期計算のさまざまな段階を連鎖させる便利な方法を提供します-SpringのListenableFutureよりも柔軟性があります。
  • _@Async_は、Executorの標準的なSpring構成で、バックグラウンドタスクとスレッドの便利な管理を提供します。

しかし、両方を組み合わせることができます( Spring 4.2以降 )。次のメソッドをCompletableFutureを返すバックグラウンドタスクに変換するとします。

_public String compute() {
    // do something slow
    return "my result";
}
_

あなたがしなければならないこと:

  • まだ行っていない場合:_@EnableAsync_とExecutor Beanを使用してアプリケーションを構成します
  • _@Async_でメソッドに注釈を付ける
  • 結果をCompletableFuture.completedFuture()にラップします
_@Async
public CompletableFuture<String> computeAsync() {
    // do something slow - no change to this part
    // note: no need to wrap your code in a lambda/method reference,
    //       no need to bother about executor handling
    return CompletableFuture.completedFuture("my result");
}
_

お気づきのように、バックグラウンドタスクをエグゼキュータに送信することに煩わされる必要はありません。Springが自動的に処理します。結果を完成したCompletableFutureにラップするだけで、署名は呼び出し元が期待するものと一致します。

6
Didier L