可以實現異步、類似長連接,輪詢查詢配置改變,但是urlfilter不能對response進行參數輸出
1、Callable
https://www.jianshu.com/p/fb0645033f0f 這個詳細點
2、https://blog.csdn.net/smollsnail/article/details/79164826
https://blog.csdn.net/xiejiefeng333/article/details/84105685
https://www.cnblogs.com/aheizi/p/5659030.html
3、總結 https://blog.csdn.net/icarusliu/article/details/79539105
DeferredResult使用方式與Callable類似,但在返回結果上不一樣,它返回的時候實際結果可能沒有生成,實際的結果可能會在另外的線程裏面設置到DeferredResult中去。
該類包含以下日常使用相關的特性:
超時配置:通過構造函數可以傳入超時時間,單位爲毫秒;因爲需要等待設置結果後才能繼續處理並返回客戶端,如果一直等待會導致客戶端一直無響應,因此必須有相應的超時機制來避免這個問題;實際上就算不設置這個超時時間,應用服務器或者Spring也會有一些默認的超時機制來處理這個問題。
結果設置:它的結果存儲在一個名稱爲result的屬性中;可以通過調用setResult的方法來設置屬性;由於這個DeferredResult天生就是使用在多線程環境中的,因此對這個result屬性的讀寫是有加鎖的。
接下來將對DeferredResult的處理流程進行說明,並實現一個較爲簡單的示例。
2.2.1 DeferredResult處理流程
DeferredResult的處理過程與Callback類似,不一樣的地方在於它的結果不是DeferredResult直接返回的,而是由其它線程通過同步的方式設置到該對象中。它的執行過程如下所示:
客戶端請求服務
SpringMVC調用Controller,Controller返回一個DeferredResult對象
SpringMVC調用ruquest.startAsync
DispatcherServlet以及Filters等從應用服務器線程中結束,但Response仍舊是打開狀態,也就是說暫時還不返回給客戶端
某些其它線程將結果設置到DeferredResult中,SpringMVC將請求發送給應用服務器繼續處理
DispatcherServlet再次被調用並且繼續處理DeferredResult中的結果,最終將其返回給客戶端