Spring mvc異步處理


基於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秒沒有賦值 就報錯哈

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM