滿心歡喜的為Servlet 添加上異步支持注解(asyncSupported = true),不曾想,其異步特性完全不起作用,仔細檢測項目,發現存在一個編碼攔截器(Filter),雖使用注解,但未標明支持異步,導致被攔截的標注為異步支持的Servlet,異步特性皆失效。怎么辦,在Filter中注解里面添加asyncSupported = true。問題解決。
但轉念一想,因歷史原因,遺留系統會存在很多的Servlet 2.*規范的Filter,無法支持異步,怎么辦?全部手動修改為注解版本,可能不太現實。還好,Doug Lea的JUC并發包,為我們提供了一種實現思路。
實際步驟:
- 準備一個線程池
- 把當前請求相關屬性包裝進一個任務線程中
- 獲取當前任務線程執行結果(不一定會有返回值)
- 阻塞,執行完畢或超時,或被中斷異常,可以輸出客戶端
- 整個請求結束
實際上,提交到一個線程池的任務線程,默認會返回一個Future對象,利用Future對象的get方法阻塞的特性,當前請求需要等待任務線程執行的結束,若指定時間內任務線程順利完成,則不必等到設定的時間的邊界即可自然往下執行。
實際代碼:
需要備注說明的是,若Future.get()無參數,則意味著需要等待計算完成,然后獲取其結果。這樣可不用設定等待時間了。更多信息,請參考JDK。