私は複数のURLを呼び出すためにスプリングRestTemplateを使用してサービスを提供しています。
パフォーマンスを向上させるために、私は、並行してこれらの要求を実行したいと思います。私には2つのオプションは以下のとおりです。
- 活用のJava 8の並列ストリームは、一般的なプールをフォークジョイン
- 分離されたスレッドプールを使用してcompletable未来
そのI / O呼び出しをブロックするとパラレル・ストリームを使用することをお勧めしている場合だけ不思議?
Aは、ForkJoinPool
プロパティを盗むその作業の利点のいずれかを獲得していないので、IOの作業を行うための理想的ではありません。あなたが使用することを計画している場合commonPool
、あなたのアプリの他の部分を同様に、あなたはそれらを妨げるかもしれませんでした。専用のスレッドプールは、ExecutorService
例えば、おそらくこれら二つの間のよりよい解決策です。
私ももっと良いものを提案したいと思います。代わりに、すべての非同期ラッピングコードを自分で書くので、Springの使用を検討してくださいAsyncRestTemplate
。これは、春のWebライブラリに含まれているとそのAPIはほぼ同じですRestTemplate
。
非同期クライアント側のHTTPアクセスのためのSpringの中心的クラス。同様の方法を公開
RestTemplate
するが、戻りのListenableFuture
具体的な結果とは対照的に、ラッパー。[...]
注:デフォルトでは、
AsyncRestTemplate
HTTP接続を確立するために、標準のJDK施設に依存しています。あなたは受諾コンストラクタを使用することにより、このようなApacheのHttpComponents、ネッティー、およびOkHttpなど、さまざまなHTTPライブラリを使用するように切り替えることができますAsyncClientHttpRequestFactory
。
ListenableFuture
インスタンスは、容易に変換することができCompletableFuture
てインスタンスListenableFuture::completable()
。
Javadocの中で述べたように、あなたが指定して使用するメカニズム非同期かを制御することができますAsyncClientHttpRequestFactory
。リストされた各ライブラリの実装では、組み込みの数があります。内部的には、これらのライブラリのいくつかは、あなたが提案し何と専用のスレッドプールにIOをブロックし実行することがあります。(メモリが提供する場合)その他、ネッティーのように、接続を実行するために、非ブロッキングIOを使用しています。あなたはそれからいくつかの利益を得るかもしれません。
そして、それはあなたが結果を減らす方法あなた次第です。ではCompletableFuture
、あなたがアクセスしていanyOf
とallOf
ヘルパーとの組み合わせのインスタンスメソッドのいずれかを。
例えば、
URI exampleURI = URI.create("https://www.stackoverflow.com");
AsyncRestTemplate template = new AsyncRestTemplate/* specific request factory*/();
var future1 = template.exchange(exampleURI, HttpMethod.GET, null, String.class).completable();
var future2 = template.exchange(exampleURI, HttpMethod.GET, null, String.class).completable();
var future3 = template.exchange(exampleURI, HttpMethod.GET, null, String.class).completable();
CompletableFuture.allOf(future1, future2, future3).thenRun(() -> {
// you're done
});
AsyncRestTemplate
以来、春のWebフラックス」の賛成で廃止されましたWebClient
。(それはあなたが戻って取得してみましょうないと言うことを除いて、私はそれにはなりませんので、このAPIはかなり異なっているCompletableFuture
としても)。