返回顶部
首页 > 资讯 > 精选 >Java动态线程池插件dynamic-tp怎么使用
  • 710
分享到

Java动态线程池插件dynamic-tp怎么使用

2023-07-05 08:07:44 710人浏览 独家记忆
摘要

这篇文章主要介绍“Java动态线程池插件dynamic-tp怎么使用”,在日常操作中,相信很多人在Java动态线程池插件dynamic-tp怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java动态线

这篇文章主要介绍“Java动态线程池插件dynamic-tp怎么使用”,在日常操作中,相信很多人在Java动态线程池插件dynamic-tp怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java动态线程池插件dynamic-tp怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    前言

    dynamic-tp是一个轻量级的动态线程池插件,它是一个基于配置中心的动态线程池,线程池的参数可以通过配置中心配置进行动态的修改,目前支持的配置中心有Apollo,NacosZooKeeper,同时dynamic-tp支持线程池的监控和报警,具体特性如下:

    • 基于spring框架,现只支持SpringBoot项目使用,轻量级,引入 starter 即可使用

    • 基于配置中心实现线程池参数动态调整,实时生效;集成主流配置中心,已支持 Nacos、Apollo,Zookeeper, 同时也提供 SPI 接口可自定义扩展实现

    • 内置通知报警功能,提供多种报警维度(配置变更通知、活性报警、容量阈值报警、拒绝策略触发报警), 默认支持企业微信、钉钉报警,同时提供 SPI 接口可自定义扩展实现

    • 内置线程池指标采集功能,支持通过 MicroMeter、JSONLog 日志输出、Endpoint 三种方式,可通过 SPI 接口自定义扩展实现

    • 集成管理常用第三方组件的线程池,已集成 SpringBoot 内置 WEBServer(Tomcat、undertow、jetty)的线程池管理

    • Builder 提供TTL包装功能,生成的线程池支持上下文信息传递

    快速开始

    pom依赖

    dynamic-tp-spring-boot-starter-zookeeper是集成dynamic-tp的starter,这里引入了micrometer-reGIStry-prometheusspring-boot-starter-actuator用于对接Prometheus

        <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-logging</artifactId>        </dependency>        <dependency>            <groupId>io.GitHub.lyh300</groupId>            <artifactId>dynamic-tp-spring-boot-starter-zookeeper</artifactId>            <version>1.0.2</version>        </dependency>        <dependency>            <groupId>io.micrometer</groupId>            <artifactId>micrometer-registry-prometheus</artifactId>            <version>1.6.4</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>    </dependencies>

    YML配置

    server:
      port: 8888

    spring:
      application:
        name: dynamic-tp-zookeeper-demo
      # 下面是接入zk配置中心的配置  
      dynamic:
        tp:
          config-type: properties # zookeeper只支持properties配置
          zookeeper:
            config-version: 1.0.0 # 配置版本号
            zk-connect-str: 127.0.0.1:2181 # zk配置中心,如果是集群用逗号分开
            root-node: /configserver/userproject # 项目节点
            node: dynamic-tp-zookeeper-demo # 配置文件节点
    # 对接prometheus
    management:
      metrics:
        tags:
          application: ${spring.application.name}
      endpoints:
        web:
          exposure:
            include: '*'

    配置中心dynamic-tp-zookeeper-demo配置文件配置

    注:Zookeeper配置中心只支持properties类型配置,配置示例如下:

    spring.dynamic.tp.executors部分是对线程池的配置,该配置是数组类型,可以定义多个线程池

    spring.dynamic.tp.executors[1].notifyItems部分配置是对线程池报警平台的配置,可以配置多个报警平台

    # 开启动态线程池
    spring.dynamic.tp.enabled=true
    # 打印动态线程池banner
    spring.dynamic.tp.enabledBanner=true
    # 开启线程池监控指标收集
    spring.dynamic.tp.enabledCollect=true
    # 线程池监控指标收集类型 logging-日志文件 micrometer-采集到第三方平台 
    spring.dynamic.tp.collectorType=logging
    # 采集监控数据时间间隔 5s
    spring.dynamic.tp.monitorInterval=5
    spring.dynamic.tp.executors[0].threadPoolName=dynamic-tp-test-1
    spring.dynamic.tp.executors[0].corePoolSize=50
    spring.dynamic.tp.executors[0].maximumPoolSize=50
    spring.dynamic.tp.executors[0].queueCapacity=3000
    spring.dynamic.tp.executors[0].queueType=VariableLinkedBlockingQueue
    spring.dynamic.tp.executors[0].rejectedHandlerType=CallerRunsPolicy
    spring.dynamic.tp.executors[0].keepAliveTime=50
    spring.dynamic.tp.executors[0].allowCoreThreadTimeOut=false
    spring.dynamic.tp.executors[0].threadNamePrefix=test1
    spring.dynamic.tp.executors[0].notifyItems[0].type=capacity
    spring.dynamic.tp.executors[0].notifyItems[0].enabled=false
    spring.dynamic.tp.executors[0].notifyItems[0].threshold=80
    spring.dynamic.tp.executors[0].notifyItems[0].platfORMs[0]=ding
    spring.dynamic.tp.executors[0].notifyItems[0].platforms[1]=wechat
    spring.dynamic.tp.executors[0].notifyItems[0].interval=120
    spring.dynamic.tp.executors[0].notifyItems[1].type=change
    spring.dynamic.tp.executors[0].notifyItems[1].enabled=false
    spring.dynamic.tp.executors[0].notifyItems[2].type=liveness
    spring.dynamic.tp.executors[0].notifyItems[2].enabled=false
    spring.dynamic.tp.executors[0].notifyItems[2].threshold=80
    spring.dynamic.tp.executors[0].notifyItems[3].type=reject
    spring.dynamic.tp.executors[0].notifyItems[3].enabled=false
    spring.dynamic.tp.executors[0].notifyItems[3].threshold=1
    spring.dynamic.tp.executors[1].threadPoolName=dynamic-tp-test-2
    spring.dynamic.tp.executors[1].corePoolSize=20
    spring.dynamic.tp.executors[1].maximumPoolSize=30
    spring.dynamic.tp.executors[1].queueCapacity=1000
    spring.dynamic.tp.executors[1].queueType=VariableLinkedBlockingQueue
    spring.dynamic.tp.executors[1].rejectedHandlerType=CallerRunsPolicy
    spring.dynamic.tp.executors[1].keepAliveTime=50
    spring.dynamic.tp.executors[1].allowCoreThreadTimeOut=false
    spring.dynamic.tp.executors[1].threadNamePrefix=test2
    spring.dynamic.tp.executors[1].notifyItems[0].type=capacity
    spring.dynamic.tp.executors[1].notifyItems[0].enabled=false
    spring.dynamic.tp.executors[1].notifyItems[0].threshold=80
    spring.dynamic.tp.executors[1].notifyItems[0].platforms[0]=ding
    spring.dynamic.tp.executors[1].notifyItems[0].platforms[1]=wechat
    spring.dynamic.tp.executors[1].notifyItems[0].interval=120
    spring.dynamic.tp.executors[1].notifyItems[1].type=change
    spring.dynamic.tp.executors[1].notifyItems[1].enabled=false
    spring.dynamic.tp.executors[1].notifyItems[2].type=liveness
    spring.dynamic.tp.executors[1].notifyItems[2].enabled=false
    spring.dynamic.tp.executors[1].notifyItems[2].threshold=80
    spring.dynamic.tp.executors[1].notifyItems[3].type=reject
    spring.dynamic.tp.executors[1].notifyItems[3].enabled=false
    spring.dynamic.tp.executors[1].notifyItems[3].threshold=1

    创建线程池

    创建线程池,会注册到dynamic-tp

    @Configurationpublic class ThreadPoolConfiguration {    @Bean    public DtpExecutor dtpExecutor() {        return ThreadPoolCreator.createDynamicFast("dynamic-tp-test-1");    }    @Bean    public ThreadPoolExecutor threadPoolExecutor() {        return ThreadPoolBuilder.newBuilder()                .threadPoolName("dynamic-tp-test-2")                .corePoolSize(10)                .maximumPoolSize(15)                .keepAliveTime(15000)                .timeUnit(TimeUnit.MILLISECONDS)                .workQueue(QueueTypeEnum.SYNCHRONOUS_QUEUE.getName(), null, false)                .buildDynamic();    }}

    使用

    初次使用不注意官网文档的话可能会通过@Autowired的方式使用,目前版本这么使用是不正确的,因为当读取配置文件后,配置文件生成的线程池对象就会把@Bean创建的线程池覆盖了,所以目前版本只能根据名字从DtpRegistry获取线程池对象了,笔者也和项目作者沟通过,项目作者也觉得通过@Autowired方式更好一些,后面版本也会优化

    @Slf4j@RestController@SuppressWarnings("all")public class TestController {    @GetMapping("/dtp-zookeeper-example/test")    public String test() {        new Thread(() -> {            try {                task();            } catch (InterruptedException e) {                e.printStackTrace();            }        }).start();        return "success";    }    public void task() throws InterruptedException {        DtpExecutor dtpExecutor1 = DtpRegistry.getExecutor("dynamic-tp-test-1");        DtpExecutor dtpExecutor2 = DtpRegistry.getExecutor("dynamic-tp-test-2");        for (int i = 0; i < 100; i++) {            Thread.sleep(100);            dtpExecutor1.execute(() -> {                log.info("i am dynamic-tp-test-1 task");            });            dtpExecutor2.execute(() -> {                log.info("i am dynamic-tp-test-2 task");            });        }    }}

    监控数据和第三方平台对接

    logging方式

    spring.dynamic.tp.collectorType=logging,logging方式的监控数据,采集日志文件中,文件的位置可以通过spring.dynamic.tp.logPath配置,默认 ${user.home}/logs,日志内容如下:

    2022-03-07 13:48:31.585 INFO [dtp-monitor1:D.M.LOG] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"rejectHandlerName":"CallerRunsPolicy","queueCapacity":0,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemaininGCapacity":0,"corePoolSize":40,"queueType":"SynchronousQueue","completedTaskCount":0,"dtpName":"dynamic-tp-test-2","maximumPoolSize":55}
    2022-03-07 13:48:31.585 INFO [dtp-monitor1:D.M.LOG] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"queueCapacity":2147483647,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":2147483647,"corePoolSize":10,"queueType":"TaskQueue","completedTaskCount":0,"dtpName":"tomcatWebServerTp","maximumPoolSize":200}
    2022-03-07 13:48:36.590 INFO [dtp-monitor1:D.M.LOG] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"rejectHandlerName":"CallerRunsPolicy","queueCapacity":1024,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":1024,"corePoolSize":50,"queueType":"VariableLinkedBlockingQueue","completedTaskCount":0,"dtpName":"dynamic-tp-test-1","maximumPoolSize":50}
    2022-03-07 13:48:36.590 INFO [dtp-monitor1:D.M.LOG] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"rejectHandlerName":"CallerRunsPolicy","queueCapacity":0,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":0,"corePoolSize":40,"queueType":"SynchronousQueue","completedTaskCount":0,"dtpName":"dynamic-tp-test-2","maximumPoolSize":55}
    2022-03-07 13:48:36.590 INFO [dtp-monitor1:D.M.LOG] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"queueCapacity":2147483647,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":2147483647,"corePoolSize":10,"queueType":"TaskQueue","completedTaskCount":0,"dtpName":"tomcatWebServerTp","maximumPoolSize":200}

    MicroMeter方式

    spring.dynamic.tp.collectorType=micrometer 采集数据到第三方平台,这里使用的是Prometheus可视化展示需要在Grafana平台配置,数据源选择Prometheus,然后创建Dashboard,先要在Dashboard配置动态的参数Variables,如下图:

    Java动态线程池插件dynamic-tp怎么使用

    配置完参数后,我们创建Panel,可以创建多个Panel,然后配置Panel的数据查询,报警显示等等,如下图:

    Java动态线程池插件dynamic-tp怎么使用

    最终的Dashboard如下图:

    Java动态线程池插件dynamic-tp怎么使用

    到此,关于“Java动态线程池插件dynamic-tp怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: Java动态线程池插件dynamic-tp怎么使用

    本文链接: https://lsjlt.com/news/350503.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Java动态线程池插件dynamic-tp怎么使用
      这篇文章主要介绍“Java动态线程池插件dynamic-tp怎么使用”,在日常操作中,相信很多人在Java动态线程池插件dynamic-tp怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java动态线...
      99+
      2023-07-05
    • Java动态线程池插件dynamic-tp集成zookeeper
      目录前言配置刷新Zookeeper配置中心接入扩展实现总结前言 dynamic-tp是一个轻量级的动态线程池插件,它是一个基于配置中心的动态线程池,线程池的参数可以通过配置中心配置进...
      99+
      2023-03-02
      Java dynamic-tp Java dynamic-tp集成zookeeper
    • Java动态线程池插件dynamic-tp集成zookeeper怎么配置
      这篇文章主要介绍了Java动态线程池插件dynamic-tp集成zookeeper怎么配置的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java动态线程池插件dynamic-tp集成zookeeper怎么配置文...
      99+
      2023-07-05
    • Java动态线程池插件dynamic-tp集成过程浅析
      目录前言快速开始监控数据和第三方平台对接logging方式MicroMeter方式总结前言 dynamic-tp是一个轻量级的动态线程池插件,它是一个基于配置中心的动态线程池,线程池...
      99+
      2023-03-02
      Java动态线程池插件dynamic-tp Java dynamic-tp Java动态线程池
    • springcloud nacos动态线程池Dynamic tp配置接入实战详解
      目录一、接入步骤1、引入POM文件2、启动类加 @EnableDynamicTp 注解3、配置中心配置线程池yml实例4、配置线程池使用二、避坑指南一、接入步骤 最近业务上需要把项目...
      99+
      2022-12-19
      springcloud nacos配置接入Dynamic tp springcloud nacos
    • java怎么使用线程池启动多线程
      在 Java 中,可以使用线程池来启动多线程。以下是使用线程池启动多线程的示例代码:首先,需要导入 `java.util.concu...
      99+
      2023-09-15
      java
    • SpringBoot线程池和Java线程池怎么使用
      这篇文章主要介绍“SpringBoot线程池和Java线程池怎么使用”,在日常操作中,相信很多人在SpringBoot线程池和Java线程池怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringB...
      99+
      2023-07-06
    • Java线程池怎么用
      小编给大家分享一下Java线程池怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、什么是线程池?线程池是一种用于实现计算机程序并发执行的软件设计模式。线程池...
      99+
      2023-06-15
    • Java并发之怎么使用线程池
      这篇文章主要介绍“Java并发之怎么使用线程池”,在日常操作中,相信很多人在Java并发之怎么使用线程池问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发之怎么使用线程池”的疑惑有所帮助!接下来,请跟...
      99+
      2023-06-16
    • Java线程池怎么使用AbortPolicy策略
      本篇内容介绍了“Java线程池怎么使用AbortPolicy策略”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!线程池ThreadPoolEx...
      99+
      2023-07-02
    • java线程池状态异常怎么解决
      当Java线程池出现状态异常时,可以尝试以下解决方法: 检查线程池是否关闭:使用`isShutdown()`方法检查线程池是否已...
      99+
      2023-10-25
      java
    • 动态数据源dynamic-datasource-spring-boot-starter怎么使用
      这篇文章主要讲解了“动态数据源dynamic-datasource-spring-boot-starter怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“动态数据源dynamic-da...
      99+
      2023-07-05
    • java线程池ThreadPoolExecutor类怎么用
      这篇文章将为大家详细讲解有关java线程池ThreadPoolExecutor类怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许...
      99+
      2023-06-29
    • 怎么在Java中使用线程工厂监控线程池
      这期内容当中小编将会给大家带来有关怎么在Java中使用线程工厂监控线程池,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。ThreadFactory线程池中的线程从哪里来呢?就是ThreadFoctorypu...
      99+
      2023-06-14
    • C#线程池ThreadPool怎么使用
      这篇文章主要讲解了“C#线程池ThreadPool怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#线程池ThreadPool怎么使用”吧!一、ThreadPool概述提供一个线程池...
      99+
      2023-07-02
    • Java线程池execute()方法怎么用
      本文小编为大家详细介绍“Java线程池execute()方法怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java线程池execute()方法怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。先理解线程...
      99+
      2023-06-29
    • 怎么在Java并发包中使用ThreadPoolExecutor线程池
      这篇文章给大家介绍怎么在Java并发包中使用ThreadPoolExecutor线程池,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、线程池简介线程池的使用主要是解决两个问题:①当执行大量异步任务的时候线程池能够提供...
      99+
      2023-06-15
    • python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池怎么使用
      这篇文章主要介绍了python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中ThreadPoolE...
      99+
      2023-07-02
    • 怎么在Android中使用线程池
      本篇文章为大家展示了怎么在Android中使用线程池,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1 、newCachedThreadPool这种线程池比较灵活,也就是说它的池里的线程数量并不是固定...
      99+
      2023-05-30
      android 线程池
    • 怎么对Java 线程池的运行状态进行监控
      怎么对Java 线程池的运行状态进行监控?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数下面给出一个线程池使用示...
      99+
      2023-06-06
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作