すべての非同期呼び出しはJavaで完了するのをどのようにして待っていますか?

ChrisNY:

概念的には非常にシンプル。私たちは、NOのスレッド/非同期を使用して巨大なレガシーJavaのサイトを持っています。それは異なるmicroservicesにダースの呼び出しを行うため、ログオンに永遠にかかりますが、すべての同期時に1:他のための各待機は次の呼び出しを行う前に完了します。しかし、API呼び出しのNONEは、他のいずれかの結果に依存しません。

しかし、我々は我々が進む前に、すべての結果を持っており、それらを結合する必要があります。それは我々が並行してこれらのダースの呼び出しを行うが、非常に次のステップでそのデータを使用するようにすべて完全にそれらを待つことができなければならないことは本当に明らかに思えました。

だから、すべてが前と呼び出し後に同期しています。あるいは、単に並列に - - しかし、非同期で、並行してそれらを自分で各オフを送信するためにいいだろうし、我々は、単一の最も遅いの呼び出しではなく、すべてのコールの合計シーケンシャル倍に制限されています。

私は、Java 8の周りの操作のこの偉大な新しいセットを持って読んでCompletableFutureしかし、私は、私の使用がどこにも説明し発見していません。引き続きそれらすべてが完了するまで待って、我々がいる幸せ-私たちは、結果は約束になりたくありません。JSはありPromise.all()ますが、でも約束を返します。

私は考えることができるすべては、非同期呼び出しが行われた後、少し待ち外観を入れて、私たちはすべての結果を取得するときにのみ継続することです。これは明らかにナッツです。

私はここで何かが足りないのですか?それは私にはそれほど明白ようだが、誰もそれで問題があるように思えないので - または他のアプローチはそれほど単純ではありません-1気が依頼することです、と私はちょうどそれが届きません。

トマシュLinkowski:

私は右のそれを理解している場合、あなたはこのような何かをしたいです:

ExecutorService executorService = Executors.newFixedThreadPool(4); // TODO: proper number of threads

Future<Integer> future1 = executorService.submit(() -> callService1()); // TODO: proper type and method
Future<String> future2 = executorService.submit(() -> callService2()); // TODO: proper type and method

executorService.shutdown();
executorService.awaitTermination(5, TimeUnit.MINUTES); // TODO: proper timeout

Integer result1 = future1.get(); // TODO: proper type
String result2 = future2.get(); // TODO: proper type

説明:

  • 上記のコードは作成されますExecutorService、あなたがすべてのタスクを提出することができたと4つのスレッド、(microservicesにすなわち通話)で
  • あなたが呼ぶExecutorService.shutdown(これ以上のタスクの提出が許さ)とExecutorService.awaitTermination(待機時まですべての作業が終了しています)
  • 最後に、あなたが呼び出しFuture.getの結果を得るために、すべての先物に
    • タスクが実行中に例外を投げた場合は、への呼び出しは、そのノートFuture.getスローしますExecutionExceptionタスクがスローする例外をラップすることを

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=175359&siteId=1