李锋镝的博客

  • 首页
  • 时间轴
  • 留言
  • 插件
  • 左邻右舍
  • 关于我
    • 关于我
    • 另一个网站
  • 知识库
  • 赞助
Destiny
自是人生长恨水长东
  1. 首页
  2. 原创
  3. 正文

动态线程池 DynamicTp 的使用方法

2025年3月6日 236点热度 0人点赞 0条评论

动态线程池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 会自动更新线程池的配置,无需重启应用。

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/archives/article/4228

相关文章

  • 动态线程池框架DynamicTp使用以及架构设计
  • CompletableFuture使用详解
  • 别再背线程池的七大参数了,现在面试官都这么问
  • 以面试官视角万字解读线程池10大经典面试题
  • TransmittableThreadLocal介绍与使用
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: DynamicTp 多线程 线程池
最后更新:2025年3月6日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >

文章评论

1 2 3 4 5 6 7 8 9 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 57 58 60 61 62 63 64 65 66 67 69 72 74 76 77 78 79 80 81 82 85 86 87 90 92 93 94 95 96 97 98 99
取消回复

曾虑多情损梵行,入山又恐别倾城。世间安得双全法,不负如来不负卿。

最新 热点 随机
最新 热点 随机
SpringBoot框架自动配置之spring.factories和AutoConfiguration.imports 应用型负载均衡(ALB)和网络型负载均衡(NLB)区别 什么是Helm? TransmittableThreadLocal介绍与使用 ReentrantLock深度解析 RedisTemplate和Redisson的区别
玩博客的人是不是越来越少了?准备入手个亚太的ECS,友友们有什么建议吗?什么是Helm?2024年11月1号 农历十月初一别再背线程池的七大参数了,现在面试官都这么问URL地址末尾加不加“/”有什么区别
linux中ftp查看不到文件列表的问题 MySQL清理二进制文件 【收藏】从面试官角度观察到的程序员技能瓶颈,同时给出突破瓶颈的建议 今天七夕节呀~~ 为什么同样是分布式架构的Kafka需要Leader而Redis不需要? 基于Java8的Either类
标签聚合
JVM docker 教程 ElasticSearch 多线程 数据库 JAVA 文学 架构 Spring MySQL SQL 设计模式 IDEA SpringBoot 日常 分布式 K8s Redis 面试
友情链接
  • i架构
  • 临窗旋墨
  • 博友圈
  • 博客录
  • 博客星球
  • 哥斯拉
  • 志文工作室
  • 搬砖日记
  • 旋律的博客
  • 旧时繁华
  • 林羽凡
  • 知向前端
  • 蜗牛工作室
  • 集博栈
  • 韩小韩博客
  • 風の声音

COPYRIGHT © 2025 lifengdi.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Dylan

津ICP备2024022503号-3