本月 Tomcat 7.0.14版本正式發(fā)布,其最顯著的一個(gè)新功能就是引入了 StuckThreadDetectionValve功能,該功能可以幫助分析和檢查耗時(shí)的請(qǐng)求或潛在可能會(huì)出現(xiàn)請(qǐng)求線程阻塞等情況。
StuckThreadDetectionValve(阻塞線程檢測(cè) )功能是通過(guò)擴(kuò)展 Tomcat的 Valve機(jī)制進(jìn)行實(shí)現(xiàn)。下面是針對(duì)此塊代碼的實(shí)現(xiàn)主要源代碼進(jìn)行的分析,來(lái)探究一下該功能的實(shí)現(xiàn)原理。2011大智慧下載
下面是核心的代碼片段,但從實(shí)現(xiàn)思路上還是比較好理解的,針對(duì)所有的 tomcat請(qǐng)求,該 valve都會(huì)攔截,并到當(dāng)?shù)膱?zhí)行的線程通過(guò)一個(gè)引入進(jìn)行保存,記錄開(kāi)始時(shí)間。同時(shí)啟動(dòng) MonitoredThread 線程對(duì)當(dāng)前請(qǐng)求線程的運(yùn)行時(shí)間進(jìn)行檢測(cè),一旦出現(xiàn)超出設(shè)置的時(shí)候值,則會(huì)進(jìn)行保存,這樣可以就很容易的獲取那些效率低下的請(qǐng)求線程情況。
以下是幾個(gè)重要的全局屬性:
stuckCount 可能為阻塞的線程數(shù)
threshold 阻塞線程判斷的運(yùn)行時(shí)間的依據(jù),超過(guò)該時(shí)間上限,則將環(huán)境該線程為阻塞線程
activeThreads 當(dāng)前正在運(yùn)行中的線程
completedStuckThreadsQueue 已經(jīng)執(zhí)行完成的阻塞線程情況
invoke 方法代碼如下:
把所有請(qǐng)求的線程都放置到 activeThreads Map 對(duì)象中,在執(zhí)行完成后,進(jìn)行清除。
接下來(lái),復(fù)寫(xiě) backgroundProcess方法 , 對(duì)線程的運(yùn)行狀態(tài)和時(shí)間進(jìn)行檢測(cè),一旦有發(fā)現(xiàn)阻塞嫌疑,則進(jìn)行記錄。