CodeFox

其他

动态线程池(DynamicTp)之动态调整Tomcat、Jetty、Undertow线程池参数篇

大家好,这篇文章我们来介绍下动态线程池框架(DynamicTp)的adapter模块,上篇文章也大概介绍过了,该模块主要是用来适配一些第三方组件的线程池管理,让第三方组件内置的线程池也能享受到动态参数调整,监控告警这些增强功能。DynamicTp项目地址目前500多star,感谢你的star,欢迎pr,业务之余给开源贡献一份力量gitee地址:https://gitee.com/yanhom/dynamic-tpgithub地址:https://github.com/lyh200/dynamic-tp系列文章属实把线程池玩明白了美团动态线程池实践思路,开源了:https://juejin.cn/post/7063408526894301192动态线程池框架(DynamicTp)之监控及源码解析篇:https://juejin.cn/post/7069581808932749348adapter已接入组件adapter模块目前已经接入了SpringBoot内置的三大WebServer(Tomcat、Jetty、Undertow)的线程池管理,实现层面也是和核心模块做了解耦,利用spring的事件机制进行通知监听处理。可以看出有两个监听器当监听到配置中心配置变更时,在更新我们项目内部线程池后会发布一个RefreshEvent事件,DtpWebRefreshListener监听到该事件后会去更新对应WebServer的线程池参数。同样监控告警也是如此,在DtpMonitor中执行监控任务时会发布CollectEvent事件,DtpWebCollectListener监听到该事件后会去采集相应WebServer的线程池指标数据。要想去管理第三方组件的线程池,首先肯定要对这些组件有一定的熟悉度,了解整个请求的一个处理过程,找到对应处理请求的线程池,这些线程池不一定是JUC包下的ThreadPoolExecutor类,也可能是组件自己实现的线程池,但是基本原理都差不多。Tomcat、Jetty、Undertow这三个都是这样,他们并没有直接使用JUC提供的线程池实现,而是自己实现了一套,或者扩展了JUC的实现;翻源码找到相应的线程池后,然后看有没有暴露public方法供我们调用获取,如果没有就需要考虑通过反射来拿了。Tomcat内部线程池的实现Tomcat内部线程池没有直接使用JUC下的ThreadPoolExecutor,而是选择继承JUC下的Executor体系类,然后重写execute()等方法,不同版本有差异。1.继承JUC原生ThreadPoolExecutor(9.0.50版本及以下),并覆写了一些方法,主要execute()和afterExecute()2.继承JUC的AbstractExecutorService(9.0.51版本及以上),代码基本是拷贝JUC的ThreadPoolExecutor,也相应的微调了execute()方法注意Tomcat实现的线程池类名称也叫ThreadPoolExecutor,名字跟JUC下的是一样的,Tomcat的ThreadPoolExecutor类execute()方法如下:public
2022年3月10日
其他

属实把线程池玩明白了

大家好,今天我们来聊一个比较实用的话题,动态可监控的线程池实践,全新开源项目(DynamicTp)地址在文章末尾,欢迎交流学习。写在前面稍微有些Java编程经验的小伙伴都知道,Java的精髓在juc包,这是大名鼎鼎的Doug
2022年1月25日