아시다시피 Spring RestTemplate 은 동기식이며 웹 클라이언트가 응답을받을 때까지 스레드를 차단하고 Spring WebClient 는 비동기식이며 비 차단입니다.
하지만 @Async 어노테이션이 달린 메서드 내에서 RestTemplate을 사용하여 API를 호출하면 어떻게 될까요?
@Async가 만든 새 스레드를 차단합니까 ?
마지막으로 Rest API의 비동기 호출에 대한 제안은 무엇입니까 ( WebClient가 없는 경우 5보다 오래된 Spring 버전을 사용하고 있기 때문에). 감사
@Async
어노테이션이 달린 메서드 내에서 RestTemplate을 사용하여 API를 호출하면 어떻게 될까요?
이 메서드는 @Async
어노테이션 매개 변수에 지정한 실행 프로그램에서 비동기 적으로 실행 됩니다. 예를 들어 @Async("threadPool")
"threadPool"은 Executor Bean의 이름입니다.
@Async로 만든 새 스레드를 차단합니까?
예, Spring이 메소드를 실행하는 스레드를 차단합니다. 그러나 스레드는 반드시 Spring에 의해 생성되는 것은 아니며 @Async
어노테이션에 정의한 스레드 풀에서 가져올 수 있습니다 .
Rest API의 비동기 호출에 대한 제안은 무엇입니까 (5보다 오래된 Spring 버전을 사용하고 있기 때문에 WebClient없이)?
CompletableFuture API를 사용하거나 @Async
"비동기"효과가 필요한 경우 사용할 수 있습니다 . 그러나 "non-blocking"속성도 필요하면 일부 non-blocking HTTP 클라이언트 (예 : okhttp)를 사용해야 합니다.
okhttp를 사용한 비 차단 비동기 HTTP 호출은 다음과 같습니다.
public CompletableFuture<Response> call() {
Request request = new Request.Builder()
.url(URL)
.build();
Call call = client.newCall(request);
CompletableFuture<Response> result = new CompletableFuture<>();
call.enqueue(new Callback() {
public void onResponse(Call call, Response response) throws IOException {
result.complete(response);
}
public void onFailure(Call call, IOException e) {
result.completeExceptionally(e);
}
});
return result;
}