1. 程式人生 > >多線程,共享HttpServeltRequest對象時候,對象丟失現象

多線程,共享HttpServeltRequest對象時候,對象丟失現象

程序啟動 丟失 中一 項目 銷毀 t對象 超時 有時 數據封裝

問題背景: web項目中一個比較復雜的查詢功能,需要調用很多的底層接口,占用時間會比較多,如果用正常的用戶線程,就是一個接口一個接口的調用,整的的時間會很多,因此使用多線程查詢。對於每個底層都是一個一個線程查詢,查詢完成後,再匯總結果返回。

問題描述: 程序啟動的查詢接口的線程(下面成為子線程)在調用共享對象HttpServletRequest時候,有時候會報錯找不到屬性。有時候正常不報錯。這個很奇怪,因為HttpServletRequest是在用戶線程進來的時候,servlet容器自動初始化好了的,各個屬性都是準備好的,也沒有對外提供刪除屬性的方法。

問題猜想:子線程調用的時候HttpServletRequest屬性丟失,肯定是哪裏給刪掉了,用戶程序裏面沒有調用,那就是servlet容器給刪掉了。。所以可能是用戶線程已經執行完了返回給前端了,sevlet認為這個線程使用的servlet相關數據都已經無用了,所以自動對servlet對象做了銷毀處理。 那子線程還沒有走完,還在使用servLET,也說明子線程執行超時未完成,主線程不再等待了。。

檢查猜想:將子線程執行時間設置很長,以保證子線程中的後續任務有足夠時間執行。經過反復測試,沒有再出現servletRequest對象丟失的問題了,猜想正確。

程序修正:不再使用HttpServeltRequest作為共享對象在各個線程之前。自定義一個線程安全的公用對象,將類似客戶端相關的數據封裝到該對象中,然後用於各個方法線程之間數據傳遞。

多線程,共享HttpServeltRequest對象時候,對象丟失現象