使用tomcat做爲web應用容器時,啓用新線程找不到Session的問題

  今天作一個功能,爲了快速響應前端,業務完成後,另起了一個線程作一些不影響業務的統計工做,而後當即將業務操做結果返回給前臺。前端

      結果在新線程裏報空指針找不到request對象。檢查了下,咱們用的是struts2的框架,在struts2裏會把request綁定在線程局部變量裏。經過上下文的ServeltActionContext就能取了。那我就手動在新線程裏把request設置到struts2的上下文裏吧。apache

       request找獲得了,但request.getSession()是空的。很奇怪,這麼短的時間不可能session超時銷燬啊。發現若是原來那個主線sleep一下,不那麼急着返回前端,就不會有這個錯。推測是容器在完成響應會作了什麼操做,致使request找不到關聯的session了。tomcat

       查看tomcat的源代碼,發現他的httpResquest接口實現類 org.apache.catalina.connector.Request有一個recycle方法。顧名思義回收,把這個Request的上下文給清掉了,固然session也沒有了。這樣新的請求來的時候,就不用建立了,直接把這個沒有狀態的對象綁定上新的上下文就能用了,至關於一個對象池的做用。session

      因此緣由就是,主線程執行得很快,完成的時候主線程綁定的request被清理了,再也不與session關聯了。而咱們新建立的線程綁定了那個request對象,在主線程完成後就找不到session了。解決方法很簡單,把session也用線程局部變量綁定到新線程就好了。框架

相關文章
相關標籤/搜索