私は基本的に入力日付で与えられたデータを要求するサーブレット要求を持っています。複数の日付があるので、複数のリクエストを送信し、結果を集計する必要があります。例:CompletableFutureでWebサービスリクエストを並列化する方法は?
List<Result> results = new ArrayList<>();
for (LocalDate date : dates) {
ServletReq req = new ServletReq(date);
try {
ServletRsp rsp = webservice.send(req);
results.addAll(rsp.getResults());
} catch (SpecificException e) {
//just ignore this result and continue
}
}
質問:上記のコードをどのように並列化できますか?手段:複数のServletReq
asyncを送信し、結果をリストに収集します。すべての要求が完了するのを待ちます(タイムアウトの可能性もあります)。SpecificException
は無視してください。
次のように私が始めたが、これは正しい方向であるかどうかは知りませんか、また、私は完全に上記のコードを転送成功しなかった、どちらも。特に例外に関しては無視されます。
ExecutorService service = Executors.newCachedThreadPool();
List<CompletableFuture<ServletRsp>> futures = new ArrayList<>();
for (LocalDate date : dates) {
ServletReq req = new ServletReq(date);
CompletableFuture future = CompletableFuture.supplyAsync(() -> webservice.send(req), service);
futures.add(future);
}
CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).join();
はこれまでのところ、しかし:どのように私は非同期結果にrsp.getResults()
を呼び出し、list
にすべてを置くことができます。そして、非同期実行中にSpecificException
を無視するにはどうすればよいですか? (私はwebservice.send()
の方法を変更できません!)。
将来のリストをたどり、try catchブロックをFuture.get()に配置できます。 FutureTask。get()は、ExecutorExceptionとしてタスクによってスローされた例外を再度スローします – pvpkiran