我一直在做这个关于如何返回异步可调用对象的教程.它按预期工作.但是当第一个请求休眠5秒钟时,我得到了第二个请求,控制器在处理第二个请求之前等待先前的芬兰请求.
如何让控制器立即处理每个请求并在后台进行睡眠?
@编辑
示例:想象一下这样一种情况,即我的控制器需要向外部api发出请求,并根据其响应它应该发送自己的响应.外部api调用需要2秒钟.我希望我的应用程序的用户只等待2.5秒,而不是放在队列中,因为控制器一次只能处理一个请求.
dev*_*per 12
REST控制器是多线程的吗?
REST控制器是多线程的,因为它同时DisptcherServlet处理来自客户端的多个请求,并使用相应的控制器方法.您可以在此处参考请求处理流程
如何让控制器立即处理每个请求并在后台进行睡眠?
你可以通过返回Callable<String>Spring控制器方法来做到这一点,如下所示:
@Controller
public class MyController {
@RequestMapping(value="/sleep")
public Callable<String> myControllerMethod() {
Callable<String> asyncTask = () -> { try {
System.out.println(" WAITING STARTED:"+new Date());
Thread.sleep(5000);
System.out.println(" WAITING COMPLETED:"+new Date());
return "Return";//Send the result back to View Return.jsp
} catch(InterruptedException iexe) {
//log exception
return "ReturnFail";
}};
return asyncTask;
}
Run Code Online (Sandbox Code Playgroud)
输出:
等待开始:2016年11月24日星期四21:03:12 GMT
等待完成:2016年11月24日星期四21:03:17 GMT
在此之后,视图将返回"Return.jsp"页面.
这里,控制器方法将在一个单独的线程中运行(释放实际的servlet线程),一旦任务完成,Result将再次发送回客户端(View等..).
PS: 您需要添加@EnableAsync作为应用程序配置的一部分,您可以在此处查看.
| 归档时间: |
|
| 查看次数: |
9434 次 |
| 最近记录: |