hel*_*ava 11 spring spring-mvc spring-boot spring-web
我想通过在普通控制器上启用Spring Boot中的异步控制器来分析我可能看到的改进
所以这是我的测试代码.一个API返回Callable,另一个API是普通控制器API.两个API都阻止了10个模拟长时间运行的任务
@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");
};
}
Run Code Online (Sandbox Code Playgroud)
我用这个配置设置了嵌入式tomcat,即只有一个tomcat处理线程:
server.tomcat.max-threads=1
logging.level.org.springframework=debug
Run Code Online (Sandbox Code Playgroud)
对/ api/1的期望 因为只有一个tomcat线程,所以在10secs之后处理这个处理将不会受理另一个请求
结果: 满足期望
/ api/2的期望 因为我们立即返回一个可调用的,所以单个tomcat线程应该可以自由处理另一个请求.Callable将在内部启动一个新线程.因此,如果您点击相同的API,它也应该被接受.
结果: 这没有发生,直到可调用完全执行,没有进一步的请求被接受.
问题 为什么/ api/2表现不如预期?
小智 14
@DaveSyer是对的,/ api/2实际上是按预期运行的.
我假设您正在使用Web浏览器测试行为.至少Firefox和Chrome会阻止对同一网址的多个同时请求.如果使用api/2打开2个选项卡,则第二个选项卡仅在第一个获得响应后向应用程序发送请求.
尝试使用简单的bash脚本进行测试,例如:
curl localhost/api/2 &
curl localhost/api/2 &
curl localhost/api/2 &
Run Code Online (Sandbox Code Playgroud)
它将在同一时间打印3个响应.
| 归档时间: |
|
| 查看次数: |
2163 次 |
| 最近记录: |