5.1 sendAsync() メソッド

HttpClient を使用して非同期リクエストを送信することもできます。通常、これは 3 つの場合に行われます。

1 つ目のケースは、ファイルの送受信など、リクエストに非常に時間がかかる場合です。この操作は非同期で開始され、実行されます。

2 番目のケースは、リクエストを頻繁に送信する必要があり、次のリクエストを送信する前に前のリクエストからの応答を待ちたくない場合です。

そして最後の 3 番目のケース -リクエストの結果はあなたにとって重要ではありません。たとえば、1 分に 1 回画面のスクリーンショットを撮り、サーバーに送信します。つまり、アプリケーションのロジックは、多数のリクエストがあり、すべてがリクエストに到達するとは限らないことを前提としています。そうすれば、送信して忘れるという原則に従って作業するのが便利です。

非同期リクエストを送信するには、sendAsync()HttpClient クラスのオブジェクトのメソッドを呼び出す必要があります。このメソッドはただちに終了し、 を返しますCompletableFuture<HttpResponse>。これを使用すると、リクエストが実際にいつ実行されるかを追跡したり、リクエストの完了後に特定のコードを実行したりできます。例:

HttpClient client = HttpClient.newBuilder().build();

CompletableFuture<HttpResponse<String>> response = client.sendAsync(
        request,
        HttpResponse.BodyHandlers.ofString()
);

このメソッドは、サーバーが返す文字列を含む HttpResponse を内部に含むsendAsync()オブジェクトを返します。CompletableFuture

5.2 executor() メソッド、ExecutorService

ExecutorServiceまた、HttpClient を使用すると、非同期リクエストの実行に使用される (スレッドのプール)を渡すことができます。実際、サーバーサイド Java アプリケーションでは、これは常に行われます。

結局のところ、API への受信リクエストごとに別の場所でいくつかの非同期リクエストを開始すると、十分なスレッドが不足します。例:

ExecutorService executorService = Executors.newFixedThreadPool(2);

CompletableFuture<HttpResponse<String>> response1 = HttpClient.newBuilder()
  .executor(executorService)
  .build()
  .sendAsync(request, HttpResponse.BodyHandlers.ofString());

CompletableFuture<HttpResponse<String>> response2 = HttpClient.newBuilder()
  .executor(executorService)
  .build()
  .sendAsync(request, HttpResponse.BodyHandlers.ofString());

スレッド プールが設定されていない場合、デフォルトは です。java.util.concurrent.Executors.newCachedThreadPool()