在编写 DataShard 组件时,偶然发现一个上下文传递变量丢失问题
@GetMapping("/user/page")
public Mono<Page<UserDO>> pageUser() {
CompletableFuture<Page<UserDO>> future = CompletableFuture.supplyAsync(() -> demoMapper.findPage(1),
Ttl.wrap(Executors.newCachedThreadPool()));
return Mono.fromFuture(future);
}
Question:大家可以思考一下,当我在Tomcat运行以上代码时,从开始请求到响应结束🔚 一共有多少个线程参与?(这里假设demoMapper.findPage方法中不会fork多余的线程)
一共三个线程,分别是:
- Tomcat请求线程 http-nio-18080-exec-3@12303
- CachedThreadPool工作线程 pool-12-thread-1
- Tomcat响应线程 http-nio-18080-exec-3@12304
如果答案跟你猜想的不一样,那么可以接着往下看,为什么会产生这几个线程
返回Mono之后Spring如何处理
一般在Controller中执行完成,当我们返回结果之后,会经过org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#invokeAndHandle
方法
并且在方法的最后会执行org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite#handleReturnValue
来处理返回的参