我在我的代码中使用@Async
从Rest控制器到3种不同的方法进行3次并行调用。
根据我的servlet理解(可能是错误的),当spring @RestController
方法收到请求时,会为它创建一个线程,然后为每个新请求创建一个新线程。
请求线程1 - 3创建异步线程
请求线程2 - 3创建异步线程
现在Spring / Request线程如何知道哪个3异步线程属于哪个线程,即请求线程1或请求线程2.
可能会有某种映射告诉他们
我尝试在线搜索@Async
,但很少有关于其工作的文档。谷歌充斥着如何使用代码但却没有运作。
底线 - 有人可以向我解释@Async
代码
使用图片更新以获得更好的解释:
1)请求1进入并产生3个线程(A1,A2和& A3),因为它是与响应R1,R2和&的异步调用。 R3。
2)请求2进入&做同样的事情,即要求:A4,A5& A6响应为R1,R2& R3 ..
3)现在我的问题是R1,R2和& R3意识到它们是同一请求的一部分,即请求1.如果它是顺序调用,则相同的线程将从头到尾传播。但是在创建6个异步请求之后,我只能在线程转储中看到6个线程,而在请求1或请求2中只看到没有线程
那么如何完成R1,R2& R3请求1完成但不完成R1,R2& R6 谁&记录保存在哪里,请求1是从R1,R2&完成的。 R3。
答案 0 :(得分:1)
例如,我们从Spring's tutorial
采取findUser
方法
@Async
public CompletableFuture<User> findUser(String user) throws InterruptedException {
logger.info("Looking up " + user);
String url = String.format("https://api.github.com/users/%s", user);
User results = restTemplate.getForObject(url, User.class);
// Artificial delay of 1s for demonstration purposes
Thread.sleep(1000L);
return CompletableFuture.completedFuture(results);
}
假设您使用的是@EnableAsync
,则每次调用findUser
实际上都会调用以下代理:
CompletableFuture
实例。findUser
,传递相同的CompletableFuture
实例。
CompletableFuture
实例。CompletableFuture
返回给来电者。ThreadPool是在程序开头创建的,代理从中获取线程来运行代码。
The implementation位于AsyncExecutionInterceptor
类,invoke
方法。