5.1 sendAsync() 메서드

HttpClient를 사용하여 비동기 요청을 보낼 수도 있습니다. 일반적으로 이것은 세 가지 경우에 수행됩니다.

첫 번째 경우는 요청이 매우 오랜 시간이 걸리는 경우 입니다 (예: 파일 보내기/받기). 그런 다음 이 작업이 시작되고 비동기적으로 실행됩니다.

두 번째 경우는 요청을 매우 자주 보내야 하고 다음 요청을 보내기 전에 이전 요청의 응답을 기다리지 않으려는 경우입니다.

그리고 마지막으로 세 번째 경우 - 귀하의 요청 결과는 귀하에게 중요하지 않습니다 . 예를 들어 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()