码迷,mamicode.com
首页 > 编程语言 > 详细

Spring mvc异步处理

时间:2019-04-14 17:45:22      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:handler   inter   返回   请求   long   处理   get   poll   保存   

基于Servlet3.0的异步处理,springmvc的异步处理

 

 控制器返回callable, spring mvc异步处理,将callable提交到TaskExecutor  使用一个隔离线程进行执行

 DispatcherServlet和所有的Filter退出web容器的线程,但是response保持打开状态

Callable返回结果, Spring mvc 将请求重新派发给容器,回复之前的处理

根据Callable返回的结果,Springmvc继续进行视图渲染流程等(从收请求一直到视图渲染)

 

技术图片

 

两次 preHandler哦

 

异步拦截器:

  1 原生API的AsyncListener

  2 Spring mvc 实现AsyncHandlerInterceptor

 

 

消息中间件的方式:

 技术图片

 

 Spring mvc也有这样的类似的机制

 Controller:

@Controller
public class SpringMVCAsyncController {
    @ResponseBody 
    @RequestMapping("/createOrder")
    public DeferredResult<Object> createOrder(){  //3秒没有响应 就报错
        DeferredResult<Object> deferredResult = new DeferredResult<Object>((long)3000, "error: create fail...");
        DeferredResultQueue.save(deferredResult);
        return deferredResult;
    }
    @ResponseBody
    @RequestMapping("/create")
    public String create() {
        //创建订单
        String orderNum = UUID.randomUUID().toString();
        //拿出上面保存的DeferredResultQueue
         DeferredResult<Object> deferredResult = DeferredResultQueue.get();
         deferredResult.setResult(orderNum); //设置订单号createOrder() 就会得到立即返回
        return "success===>orderNum:"+orderNum;
    }
    
}

队列:

public class DeferredResultQueue {
    
   private static Queue<DeferredResult<Object>>    queue = new ConcurrentLinkedQueue<DeferredResult<Object>>();
    
   public static void save(DeferredResult<Object> deferredResult) {
       queue.add(deferredResult);
   }
   
   public static DeferredResult<Object> get() {
      return queue.poll();
   }
}

 

 请求: 3秒没有赋值 就报错哈

技术图片

 

Spring mvc异步处理

标签:handler   inter   返回   请求   long   处理   get   poll   保存   

原文地址:https://www.cnblogs.com/toov5/p/10705919.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!