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