轻量级动态线程池才是“王道”?(三)

发布于 2022-6-21 16:39
浏览
0收藏

 

三、代码示例
Nacos 或 Apollo 配置中心任选其一。

 

SpringBoot Pom 文件引入 Hippo4j Core Maven 坐标。

<dependency>
    <groupId>cn.hippo4j</groupId>
    <artifactId>hippo4j-core-spring-boot-starter</artifactId>
    <version>1.1.0</version>
</dependency>

启动类上添加 @EnableDynamicThreadPool 注解。

@SpringBootApplication
@EnableDynamicThreadPool
public class ExampleApplication {
    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }
}

在配置中心中添加 spring.dynamic.thread-pool 前缀的配置。如下:

server:
  port: 8090
  servlet:
    context-path: /example

spring:
  profiles:
    active: dev

  dynamic:
    thread-pool:
      enable: true  # 是否开启动态线程池
      banner: true  # 是否打印 banner
      collect: true  # 是否开启线程池数据采集,对接 Prometheus
      check-state-interval: 3  # 检查线程池状态,是否达到报警条件,单位秒
      notify-platforms:  # 通知报警平台,支持多个,或者任选其一
        - platform: 'WECHAT'  # 企业微信
          secret-key: 1d307bfa-815f-4662-a2e5-99415e947bb8
        - platform: 'DING'  # 钉钉
          secret-key: 56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55
        - platform: 'LARK'  # 飞书
          secret-key: 2cbf2808-3839-4c26-a04d-fd201dd51f9e
      nacos:  # nacos apollo 任选其一
        data-id: xxx
        group: xxx
      apollo:
        namespace: xxxx
      config-file-type: yml  # 配置中心文件格式
      executors:
        - thread-pool-id: 'message-consume'  # 线程池标识
          core-pool-size: 1  # 核心线程数
          maximum-pool-size: 1  # 最大线程数
          queue-capacity: 1  # 阻塞队列大小
          execute-time-out: 1000  # 执行超时时间,执行任务时间超过此时间发起报警
          blocking-queue: 'LinkedBlockingQueue'  # 阻塞队列名称,参考 QueueTypeEnum,支持 SPI
          rejected-handler: 'AbortPolicy'  # 拒绝策略名称,参考 RejectedPolicies,支持 SPI
          keep-alive-time: 1024  # 线程存活时间,单位秒  
          allow-core-thread-time-out: true  # 是否允许核心线程超时
          thread-name-prefix: 'message-consume'  # 线程名称前缀
          notify:  # 通知配置
            is-alarm: true  # 是否报警
            active-alarm: 80  # 活跃度报警阈值;假设线程池最大线程数 10,当线程数达到 8 发起报警
            capacity-alarm: 80  # 容量报警阈值;假设阻塞队列容量 100,当容量达到 80 发起报警
            interval: 8  # 报警间隔,同一线程池下同一报警纬度,在 interval 时间内只会报警一次,单位分钟
            receives: # 任选其一
              DING: 'xxx'  # 手机号
              WECHAT: 'xxx'  # 填写企业微信用户 ID(填写其它将无法达到 @ 效果)
              LARK: 'xxx' # 填写 ou_开头的用户唯一标识,否则只能普通 @

 

使用 Hippo4j ThreadPoolBuilder 构建动态线程池。

import cn.hippo4j.core.executor.DynamicThreadPool;
import cn.hippo4j.core.executor.support.ThreadPoolBuilder;

@Bean
@DynamicThreadPool
public ThreadPoolExecutor dynamicThreadPoolExecutor() {
    String consumeThreadPoolId = "message-consume";
    return ThreadPoolBuilder.builder()
            .threadFactory(consumeThreadPoolId)
            .dynamicPool()
            .build();
}

按照 Spring Bean 注入的方式使用动态线程池即可。

@Resource
private ThreadPoolExecutor dynamicThreadPoolExecutor;

dynamicThreadPoolExecutor.execute(() -> xxx);

没了,是不是很 easy?我大致试了下,不到两分钟的时间,就能让你的 SpringBoot 项目快速接入动态线程池。

 

总结下接入步骤:

  1. Pom 中引入 Hippo4j Core 包依赖;
  2. 启动类上添加动态线程池启用注解;
  3. 配置中心(Nacos 或 Apollo)添加动态线程池配置;
  4. 项目中以 Spring Bean 的形式创建动态线程池 。

 

文章转自公众号:龙台的技术笔记

标签
已于2022-6-21 16:39:09修改
收藏
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐