SpirngMVC异步请求
在SpirngMVC3.2以后支持两种异步请求
这种方式是把耗时逻辑任务的执行与服务器的管理线程相分离,从而实现多线程的并行。因为HTTP响应在异步处理结束之后才生成。
Callable:在类中直接返回
DeferredResult:可以控制超时的时间
@RequestMapping(path ="test/{id}", method = RequestMethod.GET)
@ResponseBody
public Callable send(@PathVariable String id){
return new Callable() {
@Override
public Object call()throws Exception {
return "123";
}
};
}
DeferredResult的demo
@RequestMapping(path ="test2/{id}", method = RequestMethod.GET)
@ResponseBody
public DeferredResult send2(@PathVariable String id){
DeferredResult deferredResult =new DeferredResult();
deferredResult.setResult("123");
return deferredResult;
}
在简单测试,发现DeferredResult更快,更实用
大概的流程(官网copy):
控制器先返回一个Callable对象
Spring MVC开始进行异步处理,并把该Callable对象提交给另一个独立线程的执行器TaskExecutor处理
DispatcherServlet和所有过滤器都退出Servlet容器线程,但此时方法的响应对象仍未返回
Callable对象最终产生一个返回结果,此时Spring MVC会重新把请求分派回Servlet容器,恢复处理
DispatcherServlet再次被调用,恢复对Callable异步处理所返回结果的处理
DeferredResult异步请求的处理顺序也非常类似,区别仅在于应用可以通过任何线程来计算返回一个结果:
对DeferredResult的流程
控制器先返回一个DeferredResult对象,并把它存取在内存(队列或列表等)中以便存取
Spring MVC开始进行异步处理
DispatcherServlet和所有过滤器都退出Servlet容器线程,但此时方法的响应对象仍未返回
由处理该请求的线程对 DeferredResult进行设值,然后Spring MVC会重新把请求分派回Servlet容器,恢复处理
DispatcherServlet再次被调用,恢复对该异步返回结果的处理