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()
GO TO FULL VERSION