Spring

@Async 메서드 내에서 Spring RestTemplate으로 Rest API 호출

기록만이살길 2021. 3. 22. 07:03
반응형

@Async 메서드 내에서 Spring RestTemplate으로 Rest API 호출

1. 질문(문제점):

아시다시피 Spring RestTemplate 은 동기식이며 웹 클라이언트가 응답을받을 때까지 스레드를 차단하고 Spring WebClient 는 비동기식이며 비 차단입니다.

하지만 @Async 어노테이션이 달린 메서드 내에서 RestTemplate을 사용하여 API를 호출하면 어떻게 될까요?

@Async가 만든 새 스레드를 차단합니까 ?

마지막으로 Rest API의 비동기 호출에 대한 제안은 무엇입니까 ( WebClient가 없는 경우 5보다 오래된 Spring 버전을 사용하고 있기 때문에). 감사

2. 해결방안:

@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;
}
65656159
반응형