Spring Async を使用する利点と、自分でCompletableFuture
を返すだけの利点は何ですか?
アプリケーションはコンテナによって管理されます。自分でThread
sを生成することはお勧めしませんので、コンテナにマネージドExecutor
を注入させることができます。
@Service
class MyService {
@Autowired
private Executor executor;
public CompletableFuture<?> compute() {
return CompletableFuture.supplyAsync(() -> /* compute value */, executor);
}
}
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
にラップするだけで、署名は呼び出し元が期待するものと一致します。