Spring MVC异步模式

  servlet3.0 + spring4 环境下,为增加web容器吞吐,可将请求线程和工作线程分离,做到异步响应的模式。不多说,下面直接例子说明两种实现方式:

   1.用DeferredResult实现:

private ExecutorService pool = Executors.newCachedThreadPool(); // 工作线程池,可根据实际修改线程池类型

@RequestMapping("/test")
public DeferredResult<ModelAndView> test(){
//
final DeferredResult<ModelAndView> result = new DeferredResult<ModelAndView>(6000) ; // 构造参数为设置响应超时时间
System.out.println("请求线程id为:" + Thread.currentThread().getId());
//
pool.submit(new Runnable(){

public void run(){
System.out.println("工作线程id为:" + Thread.currentThread().getId());
// TODO:工作线程逻辑,暂省略
//
ModelAndView mv = new ModelAndView("/xx/yy") ;
mv.addObject("data", "data");// 响应数据
result.setResult(mv);
}

});

//
return result ;
}
    2.WebAsyncTask实现

@RequestMapping("/test2")
public WebAsyncTask<ModelAndView> test2(){
System.out.println("请求线程id为:" + Thread.currentThread().getId());

Callable<ModelAndView> cb = new Callable<ModelAndView>() {

@Override
public ModelAndView call() throws Exception {
// TODO:工作线程逻辑,暂省略
//
ModelAndView mv = new ModelAndView("/xx/yy") ;
mv.addObject("data", "data");// 响应数据
return mv;
}

};

return new WebAsyncTask<ModelAndView>(5000, cb); // 第一个构造参数同样为超时时间
}



*对于异步请求实现,主要分轮询和长连接,在这里http请求则是用长连接方式,也就是请求并没有去关闭连接,只是关闭了请求线程。

猜你喜欢

转载自309396447.iteye.com/blog/2319602