本月Tomcat 7.0.14版本正式发布,其最显著的一个新功能就是引入了StuckThreadDetectionValve功能,该功能可以帮助分析和检查耗时的请求或潜在可能会出现请求线程阻塞等情况。
StuckThreadDetectionValve(阻塞线程检测)功能是通过扩展Tomcat的Valve机制进行实现。下面是针对此块代码的实现主要源代码进行的分析,来探究一下该功能的实现原理。
下面是核心的代码片段,但从实现思路上还是比较好理解的,针对所有的tomcat请求,该valve都会拦截,并到当的执行的线程通过一个引入进行保存,记录开始时间。同时启动MonitoredThread线程对当前请求线程的运行时间进行检测,一旦出现超出设置的时候值,则会进行保存,这样可以就很容易的获取那些效率低下的请求线程情况。
整体类图如下: 以下是几个重要的全局属性:
stuckCount 可能为阻塞的线程数
threshold 阻塞线程判断的运行时间的依据,超过该时间上限,则将环境该线程为阻塞线程
activeThreads 当前正在运行中的线程
completedStuckThreadsQueue 已经执行完成的阻塞线程情况
invoke 方法代码如下:
把所有请求的线程都放置到 activeThreads Map对象中,在执行完成后,进行清除。
接下来,复写backgroundProcess方法, 对线程的运行状态和时间进行检测,一旦有发现阻塞嫌疑,则进行记录。
至此实现原理已经介绍完成。完整的代码实现可以参见Tomcat 7源码 下载地址
Good Luck!
Yours Matthew!