动态线程池DynamicTp是一个基于配置中心实现的轻量级动态线程池监控管理工具,可对 Java 线程池进行动态管理和监控。
特性
- 代码零侵入:所有配置放在配置中心,服务启动时拉取配置生成线程池对象放入 Spring 容器,使用时从容器获取,不影响业务代码。
- 通知告警:提供配置变更、活性、容量阈值、拒绝触发、任务执行或等待超时等多种报警维度,支持企业微信、钉钉、飞书、邮件等报警方式,还可通过 SPI 接口自定义扩展。
- 运行监控:定时采集 20 多种线程池指标数据,支持
MicroMeter
、JsonLog
日志输出、Endpoint
等方式展示,也可通过 SPI 接口自定义扩展。 - 任务增强:提供任务包装功能,实现
TaskWrapper
接口即可,如MdcTaskWrapper
等,可支持线程池上下文信息传递。 - 多配置中心支持:已支持
Nacos
、Apollo
、Zookeeper
、Consul
、Etcd
、Polaris
、ServiceComb
等,也提供 SPI 接口自定义扩展。 - 中间件线程池管理:集成管理
Tomcat
、Jetty
、Dubbo
、RocketMq
等常用第三方组件的线程池,实现调参、监控报警等功能。 - 轻量简单:基于 SpringBoot 实现,引入 starter,接入简单。
- 多模式:有增强线程池
DtpExecutor
、IO 密集型EagerDtpExecutor
、调度线程池ScheduledDtpExecutor
、有序线程池OrderedDtpExecutor
等多种模式。 - 兼容性:JUC 普通线程池和 Spring 中的
ThreadPoolTaskExecutor
加@DynamicTp
注解可被框架管理。 - 可靠性:实现 Spring 生命周期方法,在 Spring 容器关闭前尽可能处理队列中的任务。
- 高可扩展:核心功能都提供 SPI 接口,方便用户自定义个性化实现。
使用方法
1. 添加依赖
如果你使用的是 Maven 项目,在 pom.xml
中添加以下依赖:
<dependency>
<groupId>org.dromara.dynamictp</groupId>
<artifactId>dynamic-tp-spring-boot-starter</artifactId>
<version>1.1.5</version>
</dependency>
这里以 1.1.5 版本为例,你可以根据实际情况选择合适的版本。
2. 配置线程池
2.1 基于 Nacos 配置中心
首先,添加 Nacos 相关依赖:
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.10</version>
</dependency>
然后在 application.properties
或 application.yml
中配置 Nacos 信息:
spring:
application:
name: your-application-name
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
在 Nacos 控制台创建一个配置文件,内容如下:
spring:
dynamic:
tp:
enabled: true
executors:
- threadPoolName: dtpExecutor1
corePoolSize: 10
maximumPoolSize: 20
queueCapacity: 200
keepAliveTime: 60
unit: seconds
这里定义了一个名为 dtpExecutor1
的线程池,核心线程数为 10
,最大线程数为 20
,队列容量为 200
等。
2.2 基于本地配置
如果你不想使用配置中心,也可以在 application.yml
中直接配置:
spring:
dynamic:
tp:
enabled: true
executors:
- threadPoolName: dtpExecutor1
corePoolSize: 10
maximumPoolSize: 20
queueCapacity: 200
keepAliveTime: 60
unit: seconds
3. 使用线程池
在 Spring Boot
项目中,你可以通过 @Autowired
注解注入线程池并使用:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.ExecutorService;
@Service
public class MyService {
@Autowired
private ExecutorService dtpExecutor1;
public void doTask() {
dtpExecutor1.execute(() -> {
// 执行具体的任务逻辑
System.out.println("Task is running in dtpExecutor1");
});
}
}
4. 监控与告警配置(可选)
4.1 配置监控
DynamicTp
支持使用 Micrometer
进行监控,你可以添加以下依赖:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
然后在配置文件中开启监控:
management:
endpoints:
web:
exposure:
include: '*'
metrics:
export:
prometheus:
enabled: true
4.2 配置告警
如果你想开启告警功能,例如使用企业微信告警,需要添加相关配置:
spring:
dynamic:
tp:
notify:
enabled: true
platforms:
- platform: wechat
urlKey: your-url-key
receivers: user1,user2
executors:
- threadPoolName: dtpExecutor1
notifyItems:
- type: capacity
enabled: true
- type: rejection
enabled: true
这里配置了使用企业微信进行告警,当线程池容量达到阈值或发生拒绝任务时会发送告警信息。
5. 动态调整线程池配置
在使用配置中心的情况下,你可以直接在配置中心修改线程池的配置,如修改核心线程数、最大线程数等,DynamicTp
会自动更新线程池的配置,无需重启应用。