推荐一个让线程池变的更简单的工具,轻量级的动态可监控线程池!(带私活源码)

 背景

作为一个Java开发攻城狮,应用里少不了使用ThreadPoolExecutor 创建线程池,在使用的过程中你是否有以下痛点:

1、代码中创建了一个 ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适

2、凭经验设置参数值,上线后发现需要调整,改代码重新发布服务,非常麻烦

3、线程池相对开发人员来说是个黑盒,运行情况不能及时感知到,直到出现问题

面对这些痛点是否经常抓耳挠腮,所以,带着这个问题小编我来了,今天为大家介绍开源的项目是:

dynamic-tp   🔥🔥🔥 基于配置中心的轻量级动态可监控线程池

图片

介绍

dynamic-tp  ,是一个让线程池变的更简单的工具,并且拥有众多优势:

  • 动态调参:在运行时动态调整线程池参数,包括核心线程数、最大线程数、空闲线程超时时间、任务队列大小等

  • 通知报警:目前支持调参通知、活性、队列容量、拒绝策略、超时共六类通知报警维度,在运行时实时+定时检测,触发阈值进行推送

  • 运行监控:定时采集线程池运行指标数据,提供jsonlog、micrometer、endpoint三种指标数据采集方式,可灵活选择

  • 三方包集成:集成三方中间件线程池管理,已接入dubbo、rocketmq、hystrix、grpc、tomcat、undertow、jetty、grpc、okhttp等组件线程池管理

快速使用

dynamic-tp的使用也非常简单,支持多种配置中心集成,下面我们无配置中心应用接入为例,具体文档可以参考如下地址。

官网地址:https://dynamictp.cn/guide/use/quick-start.html

1、引入相应配置中心的依赖

<dependency>
            <groupId>org.dromara.dynamictp</groupId>
            <artifactId>dynamic-tp-core</artifactId>
            <version>1.1.3</version>
   </dependency>

2、配置线程池实例

配置线程池有两种方式,一是配置中心配置(推荐),二是代码配置

a、配置中心配置,仅供参考,请根据自己实际需要进行删改

spring:
  dynamic:
    tp:
      enabled:true
      enabledCollect:true# 是否开启监控指标采集,默认false
      collectorTypes:micrometer,logging# 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer
      logPath:/home/logs# 监控日志数据路径,默认 ${user.home}/logs,采集类型非logging不用配置
      monitorInterval:5# 监控时间间隔(报警检测、指标采集),默认5s
      platforms:# 通知报警平台配置
        -platform:wechat
          platformId:1# 平台id
          urlKey:3a700-127-4bd-a798-c53d8b69c# 替换
          receivers:test1,test2# 接受人企微名称
        -platform:ding
          platformId:2# 平台id
          urlKey:f80dad441fcd655438f4a08dcd6a# 替换
          secret:SECb5441fa6f375d5b9d21# 替换,非sign模式可以没有此值
          receivers:18888888888# 钉钉账号手机号
        -platform:lark
          platformId:3
          urlKey:0d944ae7-b24a-40# 替换
          receivers:test1,test2# 接受人飞书名称/openid
        -platform:email
          platformId:4
          receivers:123456@qq.com,789789@qq.com# 收件人
      executors:# 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量
        -threadPoolName:dtpExecutor1
          threadPoolAliasName:测试线程池# 线程池别名
          executorType:common# 线程池类型common、eager:适用于io密集型
          corePoolSize:6
          maximumPoolSize:8
          queueCapacity:200
          queueType:VariableLinkedBlockingQueue# 任务队列,查看源码QueueTypeEnum枚举类
          rejectedHandlerType:CallerRunsPolicy# 拒绝策略,查看RejectedTypeEnum枚举类
          keepAliveTime:50
          allowCoreThreadTimeOut:false# 是否允许核心线程池超时
          threadNamePrefix:test# 线程名前缀
          waitForTasksToCompleteOnShutdown:false# 参考spring线程池设计,优雅关闭线程池
          awaitTerminationSeconds:5# 单位(s)
          preStartAllCoreThreads:false# 是否预热所有核心线程,默认false
          runTimeout:200# 任务执行超时阈值,目前只做告警用,单位(ms)
          queueTimeout:100# 任务在队列等待超时阈值,目前只做告警用,单位(ms)
          taskWrapperNames:["ttl","mdc"]# 任务包装器名称,继承TaskWrapper接口
          notifyEnabled:true# 是否开启报警,默认true
          notifyItems:# 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警)
            -type:capacity# 报警项类型,查看源码 NotifyTypeEnum枚举类
              enabled:true
              threshold:80# 报警阈值
              platforms:[ding,wechat]# 可选配置,不配置默认拿上层platforms配置的所以平台
              interval:120# 报警间隔(单位:s)
            -type:change
              enabled:true
            -type:liveness
              enabled:true
              threshold:80
            -type:reject
              enabled:true
              threshold:1
            -type:run_timeout
              enabled:true
              threshold:1
            -type:queue_timeout
              enabled:true
              threshold:1

b、代码配置,如果想后期再添加到配置中心,可以先用 @Bean 编码式声明(方便 Spring 依赖注入)

@Configuration
publicclass DtpConfig {  
  
  /**
   * 通过 {@link @DynamicTp} 注解定义普通 juc 线程池,会享受到该框架监控功能,注解名称优先级高于方法名
   *
   * @return 线程池实例
   */
  @DynamicTp("commonExecutor")
  @Bean
  public ThreadPoolExecutor commonExecutor() {
      return (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
  }

  /**
   * 通过 {@link ThreadPoolCreator} 快速创建一些简单配置的动态线程池
   * tips: 建议直接在配置中心配置就行,不用 @Bean 声明
   *
   * @return 线程池实例
   */
  @Bean
  public DtpExecutor dtpExecutor1() {
      return ThreadPoolCreator.createDynamicFast("dtpExecutor1");
  }

  /**
   * 通过 {@link ThreadPoolBuilder} 设置详细参数创建动态线程池(推荐方式),
   * ioIntensive,参考 tomcat 线程池设计,实现了处理 io 密集型任务的线程池,具体参数可以看代码注释
   *
   * tips: 建议直接在配置中心配置就行,不用@Bean声明
   * @return 线程池实例
   */
  @Bean
  public DtpExecutor ioIntensiveExecutor() {
      return ThreadPoolBuilder.newBuilder()
              .threadPoolName("ioIntensiveExecutor")
              .corePoolSize(20)
              .maximumPoolSize(50)
              .queueCapacity(2048)
              .ioIntensive(true)
              .buildDynamic();
  }

  /**
   * tips: 建议直接在配置中心配置就行,不用 @Bean 声明
   * @return 线程池实例
   */
  @Bean
  public ThreadPoolExecutor dtpExecutor2() {
      return ThreadPoolBuilder.newBuilder()
              .threadPoolName("dtpExecutor2")
              .corePoolSize(10)
              .maximumPoolSize(15)
              .keepAliveTime(50)
              .timeUnit(TimeUnit.MILLISECONDS)
              .workQueue(QueueTypeEnum.SYNCHRONOUS_QUEUE.getName(), null, false)
              .waitForTasksToCompleteOnShutdown(true)
              .awaitTerminationSeconds(5)
              .buildDynamic();
  }
}

3、启动类加 @EnableDynamicTp 注解

4、使用 @Resource 或 @Autowired 进行依赖注入

@Resource
private ThreadPoolExecutor dtpExecutor1;

public void exec() {
   dtpExecutor1.execute(() -> System.out.println("test"));
}


总结

总的来说dynamic-tp是一个非常轻量的线程池,并且功能丰富,对代码零侵入,而且集监控报警于一体,使用上基本无需担心

最后在贴上地址:

使用文档:https://dynamictp.cn/

github代码:https://github.com/dromara/dynamic-tp

gitee代码:https://gitee.com/dromara/dynamic-tp

写在最后(私活源码)

最近有一些读者问我有没有完整的基于Springboot+Vue的在线考试系统项目源码,今天给大家整理了一下,并且录制了搭建的教程,无偿分享给大家。

一、系统运行图

1、登陆页面

图片

2、后台管理

图片

3、全套环境资源

图片

​源码文件部分截图,带视频教程

源码免费领取方式

扫码关注本号,后台回复 考试

扫码关注本号,后台回复 考试

持续关注本号,分享更多项目源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/903690.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Fluent 后处理:动画制作

瞬态仿真中&#xff0c;动画制作是很重要的一个后处理步骤。Fluent中动画输出分为两步操作。 步骤 1&#xff1a;设置动画内容 在Fluent界面左侧树状菜单中的“solution animations”页面&#xff0c;设置动画内容。 其设置界面如下图所示。 1 合理设置动画帧的输出频率&…

机器人转人工时,开启实时质检(mod_cti基于FreeSWITCH)

文章目录 前言联系我们实现步骤1. 修改拨号方案2. 启用拨号方案 前言 在客户与机器人对话中&#xff0c;是不能开启质检功能的。因为机器人识别会与质检识别产生冲突。如果用户想通过机器人转接到人工时&#xff0c;开启质检功能&#xff0c;记录客户与人工之间的对话。应该如…

简记Vue3(二)—— computed、watch、watchEffect

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

Linux字体更新 使用中文字体

问题描述&#xff0c;处理之前&#xff0c;中文乱码 处理后的结果 压缩需要上传的字体&#xff1a; 上传到LInux的字体目录&#xff0c;上传后解压出来 刷新字体&#xff1a; fc-cache -fv 测试是否正常 fc-list | grep "FontName"如果还不行 可以在代码里面指定字…

vivo 轩辕文件系统:AI 计算平台存储性能优化实践

在早期阶段&#xff0c;vivo AI 计算平台使用 GlusterFS 作为底层存储基座。随着数据规模的扩大和多种业务场景的接入&#xff0c;开始出现性能、维护等问题。为此&#xff0c;vivo 转而采用了自研的轩辕文件系统&#xff0c;该系统是基于 JuiceFS 开源版本开发的一款分布式文件…

2024年双11买什么最划算?双十一超全购物指南!

随着 2024 年双十一的脚步日益临近&#xff0c;消费者们又开始摩拳擦掌&#xff0c;准备在这个一年一度的购物狂欢节中尽情选购心仪的商品。然而&#xff0c;面对市场上琳琅满目的各类产品&#xff0c;很多人都会陷入迷茫&#xff1a;2024 年双 11 买什么最划算&#xff1f;为了…

【HTML】之基本标签的使用详解

HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是构建网页的基础。它不是一种编程语言&#xff0c;而是一种标记语言&#xff0c;用于描述网页的内容和结构。本文将带你了解HTML的基础知识&#xff0c;并通过详细的代码示例和中文注释进行讲…

nuxt数据库之增删改查,父组件子组件传值

nuxt学到数据库这里&#xff0c;就涉及到响应数据&#xff0c;父组件向子组件传值&#xff0c;子组件向父组件传值&#xff0c;最终还是需要掌握vue3的组件知识了。学习真的是一个长期的过程&#xff0c;不管学习了什么知识&#xff0c;有多少&#xff0c;都应该及时的记录下来…

Linux进程信号的处理

目录 一、信号的引入 二、信号的产生 1.通过键盘产生 &#xff08;1&#xff09;发送2号信号 &#xff08;2&#xff09;只能向前端进程传递信号 2.程序异常收到信号 &#xff08;1&#xff09;程序异常发送信号的现象 &#xff08;2&#xff09;程序异常发送信号的原因…

Nginx、Tomcat等项目部署问题及解决方案详解

目录 前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的常见原因 2. 端口开启问题2.1 Windows环境下的端口开放2.2 Linux环境下的端口开放 3. 重视日志分析3.1 Nginx日志分析3.2 Tomcat日志分析 4. 开发环境与部署后运行结果不同4.1 开发环境与生产…

Android 下载进度条HorizontalProgressView 基础版

一个最基础的自定义View 水平横向进度条&#xff0c;只有圆角、下载进度控制&#xff1b;可二次定制度高&#xff1b; 核心代码&#xff1a; Overrideprotected void onDraw(NonNull Canvas canvas) {super.onDraw(canvas);int mW getMeasuredWidth();int mH getMeasuredHei…

软考:CORBA架构

CORBA过时了吗 CORBA指南 个人小结&#xff1a; IPC&#xff0c;进程间通信&#xff0c;Socket应用在不同机器之间的通信 RPC是一种技术思想而非一种规范 但站在八九十年代的当口&#xff0c;简单来说&#xff0c;就是我在本地调用了一个函数&#xff0c;或者对象的方法&…

深入理解 SQL 中的 WITH AS 语法

在日常数据库操作中&#xff0c;SQL 语句的复杂性往往会影响到查询的可读性和维护性。为了解决这个问题&#xff0c;Oracle 提供了 WITH AS 语法&#xff0c;这一功能可以极大地简化复杂查询&#xff0c;提升代码的清晰度。本文将详细介绍 WITH AS 的基本用法、优势以及一些实际…

1.机器人抓取与操作介绍-深蓝学院

介绍 操作任务 操作 • Insertion • Pushing and sliding • 其它操作任务 抓取 • 两指&#xff08;平行夹爪&#xff09;抓取 • 灵巧手抓取 7轴 Franka 对应人的手臂 6轴 UR构型去掉一个自由度 课程大纲 Robotic Manipulation 操作 • Robotic manipulation refers…

WUP-MY-POS-PRINTER 旻佑热敏打印机票据打印uniapp插件使用说明

插件地址&#xff1a;WUP-MY-POS-PRINTER 旻佑热敏打印机票据打印安卓库 简介 本插件主要用于旻佑热敏打印机打印票据&#xff0c;不支持标签打印。适用于旻佑的各型支持票据打印的热敏打印机。本插件开发时使用的打印机型号为MY-805嵌入式面板打印机&#xff0c;其他型号请先…

spyglass关于cdc检测的一处bug

最近在使用22版spyglass的cdc检测功能&#xff0c;发现struct_check的cdc检测实际时存在一些bug的。 构造如下电路&#xff0c;当qualifier和destination信号汇聚时&#xff0c;如果des信号完全将qualifier gate住&#xff0c;sg仍然会报ac_sync。当然此问题可以通过后续funct…

基于SSM的心理咨询管理管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的心理咨询管理管理系统拥有三个角色&#xff1a;学生用户、咨询师、管理员 管理员&#xff1a;学生管理、咨询师管理、文档信息管理、预约信息管理、测试题目管理、测试信息管理…

vue 果蔬识别系统百度AI识别vue+springboot java开发、elementui+ echarts+ vant开发

编号&#xff1a;R03-果蔬识别系统 简介&#xff1a;vuespringboot百度AI实现的果蔬识别系统 版本&#xff1a;2025版 视频介绍&#xff1a; vuespringboot百度AI实现的果蔬识别系统前后端java开发&#xff0c;百度识别&#xff0c;带H5移动端&#xff0c;mysql数据库可视化 1 …

从零搭建开源陪诊系统:关键技术栈与架构设计

构建一个开源陪诊系统是一个涉及多种技术的复杂工程。为了让这个系统具备高效、可靠和可扩展的特点&#xff0c;我们需要从架构设计、技术栈选择到代码实现等方面进行全面的考量。本文将从零开始&#xff0c;详细介绍搭建开源陪诊系统的关键技术栈和架构设计&#xff0c;并提供…

iOS调试真机出现的 “__llvm_profile_initialize“ 错误

一、错误形式&#xff1a; app启动就崩溃&#xff0c;如下&#xff1a; Demo__llvm_profile_initialize:0x1045f7ab0 <0>: stp x20, x19, [sp, #-0x20]!0x1045f7ab4 <4>: stp x29, x30, [sp, #0x10]0x1045f7ab8 <8>: add x29, sp, #0x100x1…