spring DeferredResult

可以實現異步、類似長連接,輪詢查詢配置改變,但是urlfilter不能對response進行參數輸出

1、Callable

https://www.baidu.com/link?url=xj0t8IHKNM2awUY8nuVbW6bHtp06bcmweewygR6hRKh0CG5G6YPahtxpqkB9LUAE&wd=&eqid=9fbda7bc0021d5a7000000045d8c6b04

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中的結果,最終將其返回給客戶端
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章