在 @Async 方法中通过 Spring RestTemplate 调用 Rest API

Call Rest API by Spring RestTemplate within a @Async method

据我所知,Spring RestTemplate 是同步的并阻塞线程直到 web 客户端收到响应,并且 Spring WebClient 是异步和非阻塞的。

但是如果我们在 @Async 注释方法中使用 RestTemplate 调用 API 会怎样?

是否阻塞了@Async创建的新线程?

最后,您对 Rest APIs 的异步调用有何建议(没有 WebClient,因为我使用的是早于 5 的 Spring 版本) . 谢谢

what if we call an API using RestTemplate within an @Async annotated method?

该方法将 运行 在您在 @Async 注释参数中指定的执行器上异步执行。例如@Async("threadPool") 其中“threadPool”是执行器 bean 的名称。

Does it block the new thread created by @Async?

是的,它会阻塞 Spring 运行 你的方法所在的线程。但是,线程不一定是由Spring创建的,它可以从您在@Async注释中定义的线程池中获取。

What's your suggestion for the async call of Rest APIs (without WebClient because I'm using Spring version older than 5)?

如果您只需要“异步”效果,您可以使用 CompletableFuture API 或 @Async。但是,如果您还需要“非阻塞”属性,则需要使用一些非阻塞 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;
}