我想通过在普通控制器上启用Spring Boot中的异步控制器来分析我可能看到的改进
所以这是我的测试代码。一个API返回Callable,另一个API是普通控制器API。这两个API都阻止了 10secs 模拟长时间运行的任务
@RequestMapping(value="/api/1",method=RequestMethod.GET)
public List<String> questions() throws InterruptedException{
Thread.sleep(10000);
return Arrays.asList("Question1","Question2");
}
@RequestMapping(value="/api/2",method=RequestMethod.GET)
public Callable<List<String>> questionsAsync(){
return () -> {
Thread.sleep(10000);
return Arrays.asList("Question2","Question2");
};
}
我用这个配置设置嵌入式tomcat,即只有一个tomcat处理线程:
server.tomcat.max-threads=1
logging.level.org.springframework=debug
对/ api / 1的期望 由于只有一个tomcat线程,因此在10secs之后处理此请求将不会被接受
结果: 达到预期
对/ api / 2的期望 由于我们立即返回一个可调用的,所以单个tomcat线程可以自由处理另一个请求。 Callable将在内部启动一个新线程。因此,如果您点击相同的API,它也应该被接受。
结果: 这不会发生,直到可调用完全执行,不再接受进一步的请求。
题 为什么/ api / 2表现不如预期?