SpirngMVC异步请求

2018-04-25  本文已影响0人  每天进步一一点

在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再次被调用,恢复对该异步返回结果的处理

上一篇 下一篇

猜你喜欢

热点阅读