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