2011-12-21 189 views
0

是否可以從線程(而不是當前線程)獲取http請求信息?從線程獲取http請求信息

我希望能夠枚舉所有活動線程並獲取每個請求的URI。

有什麼想法?

感謝

+0

你將如何從容器中獲得所有線程? – 2011-12-21 07:31:11

+0

你的線程可能會在你迭代的時候完成,我寧願在線程(servlets)內部記錄URIs,也許在一個MBean裏面... – home 2011-12-21 09:34:38

+0

有不同的方法來獲得線程,但我最感興趣的是Stack Traces我發現最簡單的方法是使用靜態方法:Thread.getAllStackTraces() – isapir 2011-12-22 01:46:08

回答

0

試試這個:

  1. 創建servlet Filter
  2. 使其實施DynamicMBean。在過濾器的init方法中註冊bean(並在destroy方法中取消其註冊)
  3. 定義synchronizedWeakHashMap字段。
  4. 在過濾器的doFilter方法中,在之前捕獲請求的URI,調用FilterChaindoFilter方法。將線程和請求URI插入WeakHashMap。
  5. 調用鏈。
  6. 在finally塊中,將當前線程和一些任意常量(如無請求)插入到WeakHashMap中。
  7. 實現DynamicMBean,以便MBeanInfo在WeakHashMap中呈現每個線程一個MBeanAttributeInfo。使屬性名稱爲線程的名稱和類型URI(或字符串)。
  8. 實現DynamicMBean,以便getAttribute方法返回與請求的屬性名相對應的線程的URI。
  9. 配置過濾器,以便爲要跟蹤的所有URI範圍調用過濾器。

當查看MBean的屬性,你會看到URI(或NO REQUEST)爲仍處於活動狀態在已處理的至少一個請求中的JVM每個線程。當線程終止時(也可能在幾個GC週期後),WeakHashMap條目將被刪除。

現在看起來有點艱辛,我讀了它,但它應該是非常簡單的。

//尼古拉斯

+0

嗨尼古拉斯,謝謝你的詳細解釋。我管理了它的一半(過濾器和同步弱哈希映射),但當我到達MBeans節時,我陷入了困境。我將嘗試閱讀更多關於MBeans的內容,並讓這部分工作得到解決。再次感謝:) – isapir 2011-12-22 01:56:29

+0

如果你打算這樣做,我想你也可以將請求對象添加到過濾器中的ThreadLocal中 – Kidburla 2015-11-18 19:29:13