我遇到了一種情況:我使用ThreadLocal靜態變量在請求的生命週期中容納包含來自不同類的各種度量值的bean。在一個過濾器中,我創建了這個bean,並將其設置在一個線程局部變量中,並在請求處理後從同一個過濾器中的線程局部變量中移除它。我碰到的是包含來自其他請求的值的bean!對此的唯一解釋是共享的線程同時處理多個請求。所以標題中的問題。是否爲servlet處理的整個請求保證線程?
3
A
回答
6
雖然一個線程一般將處理單個請求(談到的Tomcat,肯定的),該線程可處理隨着時間的推移多個請求而不是W/O完成現有請求,除非使用包括/向前相似者。
我非常strognly建議您使用屬性瓦特/你的bean上述要求(的setAttribute()),並用它來分析。如果你不能提供各種方法的請求......那麼你被困在ThreadLocal [這不是太糟糕的解決方案]。
或者,您可以發佈代碼如何安裝/刪除threadLocal bean。
請記住,你必須向一些管理這個bean,以及(這將無法使用要求外)。
編輯:忘了問:你使用try/finally調用doFilter(...)?
的代碼應該是這樣的
installBean();
try{
chain.doFilter(req, resp);
}finally{
Bean b = deinstallBean();
useTheMetrics(b);
//potentially, process exception, etc
}
2
也可能是您的過濾器並不總是以您期望的順序調用。線程被重用來一個接一個地處理多個請求,所以如果ThreadLocal
中的值沒有被移除,那麼當線程處理它的下一個請求時它仍然會在那裏。
1
是的,你可以假設一個單獨的線程將處理每個請求。
使用finally
塊在處理鏈的其餘部分後清除(設置爲null
)過濾器中的ThreadLocal
。這將防止以前請求中的數據與當前請求混雜在一起。
相關問題
- 1. 多個請求處理servlet
- 2. ExecuteRegisteredAsyncTasks是否釋放請求處理線程以處理其他請求?
- 3. 處理多個帖子請求的Servlet
- 4. servlet過濾器是否有可能計算出哪個servlet將處理請求
- 5. 如何分配線程來處理Servlet請求?
- 6. WCF請求是否處理線程敏捷?
- 7. Axis2如何處理請求?是否爲每個請求創建了一個新線程?
- 8. 是否可以使用servlet處理ftp請求?
- 9. 從servlet創建的線程的生命是否有保證?
- 10. Python處理線程中的Socketserver請求
- 11. 似乎只有一個線程處理Servlet中的所有請求
- 12. 創建多個線程來處理多個請求是否很好?
- 13. 一個nginx工作進程是否同時處理兩個請求或逐個處理兩個請求?
- 14. .NET:澄清請求 - 處理線程
- 15. 多線程事件處理請求
- 16. 請求如何被dispacther servlet處理?
- 17. Grails - Servlet 3.0異步請求處理
- 18. 使用Servlet來處理AJAX請求?
- 19. 在JSP中處理Ajax請求Servlet
- 20. 在調用servlet之前,servlet引擎是否讀取了整個請求?
- 21. HttpContext.RemapHandler是否應該更改哪個處理程序處理請求?
- 22. asp.net web表單線程在請求處理中的線程
- 23. xmlhttprequest在請求處理後是否保持連接打開?
- 24. 使用servlet處理多部分請求和正常請求
- 25. 從Servlet請求產生線程
- 26. 在單個線程上處理來自多個線程的請求 - .NET Core
- 27. JBoss AS 7和http線程 - 是否只有一個線程處理客戶端的請求?
- 28. 錯誤的請求url處理程序servlet
- 29. 是否建議爲每個客戶端請求創建線程?
- 30. 處理ASP.Net內部線程池處理請求
是的,「終於」做到了神奇。就像邁克爾和埃裏克森所說的那樣,在一種情況下,運行時異常並沒有移除bean。謝謝。 – Murali 2011-01-26 23:39:36
拇指規則(或故事的道德):如果您修改任何全局狀態並打算將其撤回。使用try/finally,實際上使用try/finally需要任何清理/關閉/處理(或隱式回滾),它幾乎不會導致任何性能損失(認爲它是免費的:D) – bestsss 2011-01-26 23:45:32