本月 Tomcat 7.0.14版本正式發(fā)布,其最顯著的一個新功能就是引入了 StuckThreadDetectionValve功能,該功能可以幫助分析和檢查耗時的請求或潛在可能會出現(xiàn)請求線程阻塞等情況。
StuckThreadDetectionValve(阻塞線程檢測 )功能是通過擴展 Tomcat的 Valve機制進行實現(xiàn)。下面是針對此塊代碼的實現(xiàn)主要源代碼進行的分析,來探究一下該功能的實現(xiàn)原理。2011大智慧下載
下面是核心的代碼片段,但從實現(xiàn)思路上還是比較好理解的,針對所有的 tomcat請求,該 valve都會攔截,并到當?shù)膱?zhí)行的線程通過一個引入進行保存,記錄開始時間。同時啟動 MonitoredThread 線程對當前請求線程的運行時間進行檢測,一旦出現(xiàn)超出設(shè)置的時候值,則會進行保存,這樣可以就很容易的獲取那些效率低下的請求線程情況。
體類圖如下:
以下是幾個重要的全局屬性:

stuckCount 可能為阻塞的線程數(shù)
threshold 阻塞線程判斷的運行時間的依據(jù),超過該時間上限,則將環(huán)境該線程為阻塞線程
activeThreads 當前正在運行中的線程
completedStuckThreadsQueue 已經(jīng)執(zhí)行完成的阻塞線程情況
invoke 方法代碼如下:

把所有請求的線程都放置到 activeThreads Map 對象中,在執(zhí)行完成后,進行清除。
接下來,復寫 backgroundProcess方法 , 對線程的運行狀態(tài)和時間進行檢測,一旦有發(fā)現(xiàn)阻塞嫌疑,則進行記錄。

至此實現(xiàn)原理已經(jīng)介紹完成。完整的代碼實現(xiàn)可以參見
Tomcat 7源碼
posted on 2011-05-26 11:54
墻頭草 閱讀(243)
評論(0) 編輯 收藏