在 @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;
}
据我所知,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;
}