diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md deleted file mode 100644 index a19a75ba2b2f4179557ea9bc337185df2f7498b2..0000000000000000000000000000000000000000 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -name: BUG 报告 -about: 'Report a bug' -title: 'bug' -labels: 'bug' ---- - -**首先感谢您使用 DynamicTp,如果使用过程中有任何问题,请按照下述模板反馈问题,建议使用 Markdown 语法**。 - -### 版本信息 - -- Jdk版本: -- SpringBoot版本: -- DynamicTp版本: -- 配置中心版本: - -### 问题描述 - -文字描述、截图、粘代码方式 - -- 配置文件: -- 代码使用步骤: -- 报错信息: -- 猜测可能原因: - -### 复现步骤 - -1. xxx -2. xxx - -### 其他信息 - -1. xxx -2. xxx diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000000000000000000000000000000000000..68d67b0b71a2087eefe51f87710fa567d05fd2eb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,101 @@ +name: BUG 报告 +description: 'Report a bug' +title: '[BUG]: ' +labels: ['bug'] +body: + - type: markdown + attributes: + value: | + **首先感谢您使用 DynamicTp,如果使用过程中有任何问题,请按照下述模板反馈问题,请使用 Markdown 语法**。 + + - type: dropdown + id: platform + attributes: + label: 平台 + description: 您正在使用哪个平台? + options: + - Windows + - macOS + - Linux + validations: + required: true + + - type: input + id: jdk-version + attributes: + label: Jdk版本 + placeholder: 例如:JDK 8, JDK 11 + description: 您正在使用哪个 JDK 版本? + validations: + required: true + + - type: input + id: springboot-version + attributes: + label: SpringBoot版本 + placeholder: 例如:2.6.3 + description: 您正在使用哪个 SpringBoot 版本? + validations: + required: true + + - type: input + id: dynamictp-version + attributes: + label: DynamicTp版本 + placeholder: 例如:1.0.0 + description: 您正在使用哪个 dynamic-tp 版本? + validations: + required: true + + - type: input + id: config-center-type + attributes: + label: 配置中心类型 + placeholder: 例如:Nacos, Apollo + description: 您正在使用哪个配置中心? + validations: + required: false + + - type: input + id: config-center-version + attributes: + label: 配置中心版本 + placeholder: 例如:2.0.0 + description: 您正在使用哪个配置中心版本? + validations: + required: false + + - type: textarea + id: problem-description + attributes: + label: 问题描述 + description: 文字描述、截图、粘代码方式 + placeholder: | + 文字描述、截图、粘代码方式 + + - 配置文件: + - 引入的依赖: + - 代码使用步骤: + - 报错信息: + - 猜测可能原因: + validations: + required: true + + - type: textarea + id: reproduction-steps + attributes: + label: 复现步骤 + description: 请详细描述如何复现此问题 + placeholder: | + 1. xxx + 2. xxx + validations: + required: true + + - type: textarea + id: additional-info + attributes: + label: 其他信息 + description: 其他有助于解决问题的信息 + validations: + required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md deleted file mode 100644 index 3fb7f7ef3679f4085994fd884ff17e6250dee03c..0000000000000000000000000000000000000000 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -name: idea 建议 -about: Suggest an idea -title: 'feature' -labels: 'feature' ---- - -**首先感谢您使用 DynamicTp,如果对项目有好的想法建议,请按照下述模板提议讨论,建议使用 Markdown 语法**。 - -### 方案描述 - -### 应用场景 - -### 难度风险 - -### 外部依赖 diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 0000000000000000000000000000000000000000..b67c3e095cd3215ca83ff24e6b10c030fd440ef6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,45 @@ +name: idea 建议 +description: 'Suggest an idea' +title: '[FEATURE]: ' +labels: ['feature'] +body: + - type: markdown + attributes: + value: | + **首先感谢您使用 DynamicTp,如果对项目有好的想法建议,请按照下述模板提议讨论,请使用 Markdown 语法**。 + + - type: textarea + id: solution-description + attributes: + label: 方案描述 + description: 请详细描述您的建议方案 + placeholder: 详细描述您的建议方案... + validations: + required: true + + - type: textarea + id: application-scenario + attributes: + label: 应用场景 + description: 此功能适用的场景 + placeholder: 描述此功能适用的场景... + validations: + required: true + + - type: textarea + id: difficulty-risk + attributes: + label: 难度风险 + description: 实现此功能可能的难度和风险 + placeholder: 描述实现此功能可能的难度和风险... + validations: + required: true + + - type: textarea + id: external-dependencies + attributes: + label: 外部依赖 + description: 实现此功能需要的外部依赖 + placeholder: 描述实现此功能需要的外部依赖... + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/question-ask.md b/.github/ISSUE_TEMPLATE/question-ask.md deleted file mode 100644 index 0276cd1f81a3122f83e701cb263412831c5690c3..0000000000000000000000000000000000000000 --- a/.github/ISSUE_TEMPLATE/question-ask.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -name: 疑问解答 -about: Ask a question -title: 'question' -labels: 'question' ---- - -**首先感谢您使用 DynamicTp,如果对项目有任何疑问需要解答,请按照下述模板提问,建议使用 Markdown 语法**。 - -### 使用方面 - -### 原理方面 - -### 其他 \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/question-ask.yml b/.github/ISSUE_TEMPLATE/question-ask.yml new file mode 100644 index 0000000000000000000000000000000000000000..9853840a5305e843c4a16caf3179ad10e8792b44 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question-ask.yml @@ -0,0 +1,36 @@ +name: 疑问解答 +description: 'Ask a question' +title: '[QUESTION]: ' +labels: ['question'] +body: + - type: markdown + attributes: + value: | + **首先感谢您使用 DynamicTp,如果对项目有任何疑问需要解答,请按照下述模板提问,请使用 Markdown 语法**。 + + - type: textarea + id: usage-questions + attributes: + label: 使用方面 + description: 关于项目使用方面的疑问 + placeholder: 描述您关于项目使用方面的疑问... + validations: + required: false + + - type: textarea + id: principle-questions + attributes: + label: 原理方面 + description: 关于项目原理方面的疑问 + placeholder: 描述您关于项目原理方面的疑问... + validations: + required: false + + - type: textarea + id: other-questions + attributes: + label: 其他 + description: 其他方面的疑问 + placeholder: 描述您的其他方面疑问... + validations: + required: false diff --git a/.github/checkstyle/checkstyle.xml b/.github/checkstyle/checkstyle.xml index 643c0d45e7af934e581aceea7ecd1d45b1999e70..02fb3f26ea14405995c237123734fc919846e3c1 100644 --- a/.github/checkstyle/checkstyle.xml +++ b/.github/checkstyle/checkstyle.xml @@ -166,7 +166,7 @@ - + diff --git a/.github/checkstyle/suppressions.xml b/.github/checkstyle/suppressions.xml index 3abaf0c3e01c480501f2b9ed40d3be7f64374824..05d5431c50c0d6ee251fa0e58842bcf1b27e47e3 100644 --- a/.github/checkstyle/suppressions.xml +++ b/.github/checkstyle/suppressions.xml @@ -6,5 +6,6 @@ + diff --git a/.github/workflows/build-jvmti.yml b/.github/workflows/build-jvmti.yml index 1f19e0fc3166c7d63764406b67b15e9968ca0a44..a53234eaac87c5f54cbd7bcb302b60dee3ba0f76 100644 --- a/.github/workflows/build-jvmti.yml +++ b/.github/workflows/build-jvmti.yml @@ -4,7 +4,7 @@ on: [push] jobs: linux: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up JDK 8 @@ -16,9 +16,9 @@ jobs: run: | cd ${{ github.workspace }}/jvmti/jvmti-build mvn package - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: - name: lib + name: lib-linux path: jvmti/jvmti-build/target/classes/lib* if-no-files-found: error @@ -26,18 +26,18 @@ jobs: runs-on: macos-latest steps: - uses: actions/checkout@v3 - - name: Set up JDK 8 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '8' + java-version: '17' distribution: 'adopt' - name: Build with Maven run: | cd ${{ github.workspace }}/jvmti/jvmti-build mvn package - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: - name: lib + name: lib-macos path: jvmti/jvmti-build/target/classes/lib* if-no-files-found: error @@ -54,8 +54,8 @@ jobs: run: | cd ${{ github.workspace }}/jvmti/jvmti-build mvn package - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: - name: lib + name: lib-windows path: jvmti/jvmti-build/target/classes/*.dll if-no-files-found: error diff --git a/.github/workflows/maven-build.yml b/.github/workflows/maven-build.yml index 3a4a4a09f2faf00a972eb0b8d0d79005e5586126..53dc3607b40ce18f9077b146d81f994177b7bbd8 100644 --- a/.github/workflows/maven-build.yml +++ b/.github/workflows/maven-build.yml @@ -1,11 +1,3 @@ -# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven - -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - name: Java CI with Maven on: @@ -16,16 +8,15 @@ on: jobs: build: - runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: Set up JDK 8 - uses: actions/setup-java@v3 - with: - java-version: '8' - distribution: 'temurin' - cache: maven - - name: Build with Maven - run: mvn -B package --file pom.xml + - uses: actions/checkout@v3 + - name: Set up JDK 8 + uses: actions/setup-java@v3 + with: + java-version: '8' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn -B package --file pom.xml -DskipThrift=true \ No newline at end of file diff --git a/README.md b/README.md index dd33ca52085e618f059503d1086bd44ae8f78b22..b87706996258ae215105de36b81e15579224883a 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ + fork - 备注加群

@@ -20,7 +20,7 @@ --- -## 使用痛点 +## 痛点 使用线程池 ThreadPoolExecutor 过程中你是否有以下痛点呢? @@ -84,29 +84,29 @@ protected void afterExecute(Runnable r, Throwable t); > > 4. 集成常用三方中间件内部线程池管理 -**经过多个版本的迭代,目前最新版本 v1.1.7 具有以下特性** ✅ +**经过多个版本的迭代,目前最新版本 v1.2.1 具有以下特性** ✅ - **代码零侵入**:我们改变了线程池以往的使用姿势,所有配置均放在配置中心,服务启动时会从配置中心拉取配置生成线程池对象放到 Spring 容器中,使用时直接从 Spring 容器中获取,对业务代码零侵入 +- **轻量简单**:使用起来极其简单,引入相应依赖,接入只需简单 4 步就可完成,顺利 3 分钟搞定,相当丝滑 + - **通知告警**:提供多种通知告警维度(配置变更通知、活性报警、队列容量阈值报警、拒绝触发报警、任务执行或等待超时报警),触发配置阈值实时推送告警信息,已支持企微、钉钉、飞书、邮件、云之家报警,同时提供 SPI 接口可自定义扩展实现 -- **运行监控**:定时采集线程池指标数据(20 多种指标,包含线程池维度、队列维度、任务维度、tps、tp99等),支持通过 MicroMeter、JsonLog 两种方式,也可以通过 SpringBoot Endpoint 端点实时获取最新指标数据,同时提供 SPI 接口可自定义扩展实现 +- **运行监控**:定时采集线程池指标数据(20 多种指标,包含线程池维度、队列维度、任务维度、tps、tpxx 等),支持通过 MicroMeter、JsonLog、JMX 三种方式定时获取,也可以通过 SpringBoot Endpoint 端点实时获取最新指标数据,同时提供 SPI 接口可自定义扩展实现 - **任务增强**:提供任务包装功能(比 Spring 线程池任务包装更强大),实现 TaskWrapper 接口即可,如 MdcTaskWrapper、TtlTaskWrapper、SwTraceTaskWrapper、OpenTelemetryWrapper,可以支持线程池上下文信息传递 - **多配置中心支持**:支持多种主流配置中心,包括 Nacos、Apollo、Zookeeper、Consul、Etcd、Polaris、ServiceComb,同时也提供 SPI 接口可自定义扩展实现 -- **中间件线程池管理**:集成管理常用第三方组件的线程池,已集成 Tomcat、Jetty、Undertow、Dubbo、RocketMq、Hystrix、Grpc、Motan、Okhttp3、Brpc、Tars、SofaRpc、RabbitMq 等组件的线程池管理(调参、监控报警) - -- **轻量简单**:使用起来极其简单,引入相应依赖,接入只需简单 4 步就可完成,顺利 3 分钟搞定,相当丝滑 +- **中间件线程池管理**:集成管理常用第三方组件的线程池,已集成 Tomcat、Jetty、Undertow、Dubbo、RocketMq、Hystrix、Grpc、Motan、Okhttp3、Brpc、Tars、SofaRpc、RabbitMq、Liteflow 等组件的线程池管理(动态调参、监控、报警) - **多模式**:提供了增强线程池 DtpExecutor,IO 密集型场景使用的线程池 EagerDtpExecutor,调度线程池 ScheduledDtpExecutor,有序线程池 OrderedDtpExecutor,可以根据业务场景选择合适的线程池 -- **兼容性**:JUC 普通线程池和 Spring 中的 ThreadPoolTaskExecutor 也可以被框架管理,@Bean 定义时加 @DynamicTp 注解即可 +- **兼容性**:JUC 普通线程池和 Spring 中的 ThreadPoolTaskExecutor 也可以被框架管理,只需@Bean 定义时加 @DynamicTp 注解即可 - **可靠性**:依靠 Spring 生命周期管理,可以做到优雅关闭线程池,在 Spring 容器关闭前尽可能多的处理队列中的任务 -- **高可扩展**:框架核心功能都提供 SPI 接口供用户自定义个性化实现(配置中心、配置文件解析、通知告警、监控数据采集、任务包装等等) +- **高可扩展**:框架核心功能都提供 SPI 接口供用户自定义个性化实现(配置中心、配置文件解析、通知告警、监控数据采集、任务包装、拒绝策略等等) - **线上大规模应用**:参考[美团线程池实践](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html),美团内部已经有该理论成熟的应用经验 @@ -182,15 +182,25 @@ protected void afterExecute(Runnable r, Throwable t); --- +## 知识星球 + + + + + +--- + ## Star History [![Star History Chart](https://api.star-history.com/svg?repos=dromara/dynamic-tp&type=Date)](https://star-history.com/#dromara/dynamic-tp&Date) --- -## 知识星球 +## 代码托管 -![](/resources/img/zsxq.jpg) +- github: https://github.com/dromara/dynamic-tp +- gitee: https://gitee.com/dromara/dynamic-tp +- gitcode: https://gitcode.com/dromara/dynamic-tp --- @@ -198,9 +208,9 @@ protected void afterExecute(Runnable r, Throwable t); 看到这儿,**请给项目一个 star**,你的支持是我们前进的动力! -使用过程中有任何问题,或者对项目有什么想法或者建议,可以加入社群,跟 1000+ 群友一起交流讨论。 +使用过程中有任何问题,或者对项目有什么想法或者建议,可以加入社群,跟 1500+ 群友一起交流讨论。 -微信群已满 200 人,可以关注微信公众号,加我个人微信拉群(备注:dynamic-tp)。 +微信群均已满 200 人,可以关注微信公众号,加我个人微信拉群(备注:dynamic-tp 拉群)。 ![](resources/img/contact.jpg) @@ -214,13 +224,6 @@ protected void afterExecute(Runnable r, Throwable t); --- -## 特别赞助 - -**JNPF低代码开发平台** - - - ---- ## 鸣谢 感谢 JetBrains 对开源项目的支持 diff --git a/adapter/adapter-brpc/pom.xml b/adapter/adapter-brpc/pom.xml index 747ecbbd04aa716b927e65cdd4a88ca5f143f796..7c3c8511226f2eac2ae2f2c9aa9ccc969733530a 100644 --- a/adapter/adapter-brpc/pom.xml +++ b/adapter/adapter-brpc/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-adapter-brpc diff --git a/adapter/adapter-common/pom.xml b/adapter/adapter-common/pom.xml index ed664817c7b532c58867a009d2a0370d3fbc1ec3..d9fbed85373c4e30e4be99d85762a6e2ae213df1 100644 --- a/adapter/adapter-common/pom.xml +++ b/adapter/adapter-common/pom.xml @@ -5,9 +5,8 @@ org.dromara.dynamictp dynamic-tp-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-adapter-common - diff --git a/adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/AbstractDtpAdapter.java b/adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/AbstractDtpAdapter.java index a506fc4120bf50815fb49d5860e006d89dc71bf2..9fe5d66561e20a890d89044e9a6163b18ceb0630 100644 --- a/adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/AbstractDtpAdapter.java +++ b/adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/AbstractDtpAdapter.java @@ -22,6 +22,7 @@ import com.github.dadiyang.equator.FieldInfo; import com.github.dadiyang.equator.GetterBaseEquator; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.google.common.eventbus.Subscribe; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.apache.commons.collections4.CollectionUtils; @@ -31,21 +32,22 @@ import org.dromara.dynamictp.common.entity.NotifyPlatform; import org.dromara.dynamictp.common.entity.ThreadPoolStats; import org.dromara.dynamictp.common.entity.TpExecutorProps; import org.dromara.dynamictp.common.entity.TpMainFields; +import org.dromara.dynamictp.common.event.CustomContextRefreshedEvent; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; +import org.dromara.dynamictp.common.manager.EventBusManager; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; -import org.dromara.dynamictp.common.spring.OnceApplicationContextEventListener; import org.dromara.dynamictp.common.util.ReflectionUtil; import org.dromara.dynamictp.common.util.StreamUtil; import org.dromara.dynamictp.core.aware.AwareManager; import org.dromara.dynamictp.core.converter.ExecutorConverter; import org.dromara.dynamictp.core.notifier.manager.NoticeManager; -import org.dromara.dynamictp.core.support.ExecutorAdapter; import org.dromara.dynamictp.core.support.ExecutorWrapper; -import org.dromara.dynamictp.core.support.ThreadPoolExecutorProxy; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; import org.dromara.dynamictp.core.support.task.wrapper.TaskWrapper; import org.dromara.dynamictp.core.support.task.wrapper.TaskWrappers; -import org.springframework.context.event.ContextRefreshedEvent; +import java.lang.reflect.Field; import java.util.Collections; import java.util.List; import java.util.Map; @@ -67,20 +69,24 @@ import static org.dromara.dynamictp.core.support.DtpLifecycleSupport.shutdownGra * @since 1.0.6 */ @Slf4j -public abstract class AbstractDtpAdapter extends OnceApplicationContextEventListener implements DtpAdapter { +public abstract class AbstractDtpAdapter implements DtpAdapter { private static final Equator EQUATOR = new GetterBaseEquator(); protected final Map executors = Maps.newHashMap(); - @Override - protected void onContextRefreshedEvent(ContextRefreshedEvent event) { + protected AbstractDtpAdapter() { + EventBusManager.register(this); + } + + @Subscribe + public synchronized void onContextRefreshedEvent(CustomContextRefreshedEvent event) { try { - DtpProperties dtpProperties = ApplicationContextHolder.getBean(DtpProperties.class); + DtpProperties dtpProperties = ContextManagerHelper.getBean(DtpProperties.class); initialize(); afterInitialize(); refresh(dtpProperties); - log.info("DynamicTp adapter, {} init end, executors: {}", getTpPrefix(), executors); + log.info("DynamicTp adapter, {} init end, executors {}", getTpPrefix(), executors.keySet()); } catch (Throwable e) { log.error("DynamicTp adapter, {} init failed.", getTpPrefix(), e); } @@ -163,14 +169,25 @@ public abstract class AbstractDtpAdapter extends OnceApplicationContextEventList protected void enhanceOriginExecutor(String tpName, ThreadPoolExecutor executor, String fieldName, Object targetObj) { ThreadPoolExecutorProxy proxy = new ThreadPoolExecutorProxy(executor); - try { - ReflectionUtil.setFieldValue(fieldName, targetObj, proxy); + boolean r = ReflectionUtil.setFieldValue(fieldName, targetObj, proxy); + if (r) { + putAndFinalize(tpName, executor, proxy); + } + } + + protected void enhanceOriginExecutor(String tpName, ThreadPoolExecutor executor, Field field, Object targetObj) { + ThreadPoolExecutorProxy proxy = new ThreadPoolExecutorProxy(executor); + boolean r = ReflectionUtil.setFieldValue(field, targetObj, proxy); + if (r) { putAndFinalize(tpName, executor, proxy); - } catch (IllegalAccessException e) { - log.error("DynamicTp adapter, enhance {} failed.", tpName, e); } } + protected void enhanceOriginExecutorWithoutFinalize(String tpName, ThreadPoolExecutorProxy proxy, String fieldName, Object targetObj) { + ReflectionUtil.setFieldValue(fieldName, targetObj, proxy); + executors.put(tpName, new ExecutorWrapper(tpName, proxy)); + } + protected void putAndFinalize(String tpName, ExecutorService origin, Executor targetForWrapper) { executors.put(tpName, new ExecutorWrapper(tpName, targetForWrapper)); shutdownOriginalExecutor(origin); @@ -220,3 +237,4 @@ public abstract class AbstractDtpAdapter extends OnceApplicationContextEventList } } } + diff --git a/adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/DtpAdapterListener.java b/adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/DtpAdapterListener.java index fd60efd4fd2de5d79abb69e2778936b5b45af34b..d50fc968091d3ada573f40ce021b7c2fbfa104d4 100644 --- a/adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/DtpAdapterListener.java +++ b/adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/DtpAdapterListener.java @@ -17,23 +17,22 @@ package org.dromara.dynamictp.adapter.common; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; +import com.google.common.eventbus.Subscribe; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.apache.commons.collections4.MapUtils; import org.dromara.dynamictp.common.event.AlarmCheckEvent; import org.dromara.dynamictp.common.event.CollectEvent; import org.dromara.dynamictp.common.event.RefreshEvent; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; +import org.dromara.dynamictp.common.manager.EventBusManager; +import org.dromara.dynamictp.common.notifier.type.NotifyItemTypeRegistry; import org.dromara.dynamictp.common.properties.DtpProperties; import org.dromara.dynamictp.core.handler.CollectorHandler; import org.dromara.dynamictp.core.notifier.manager.AlarmManager; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.springframework.context.ApplicationEvent; -import org.springframework.context.event.GenericApplicationListener; -import org.springframework.core.ResolvableType; -import org.springframework.lang.NonNull; -import org.springframework.lang.Nullable; -import org.springframework.util.CollectionUtils; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.SCHEDULE_NOTIFY_ITEMS; +import java.util.EventObject; + /** * DtpAdapterListener related @@ -42,62 +41,37 @@ import static org.dromara.dynamictp.common.constant.DynamicTpConst.SCHEDULE_NOTI * @since 1.0.6 */ @Slf4j -public class DtpAdapterListener implements GenericApplicationListener { +public class DtpAdapterListener { - @Override - public boolean supportsEventType(ResolvableType resolvableType) { - Class type = resolvableType.getRawClass(); - if (type != null) { - return RefreshEvent.class.isAssignableFrom(type) - || CollectEvent.class.isAssignableFrom(type) - || AlarmCheckEvent.class.isAssignableFrom(type); - } - return false; + public DtpAdapterListener() { + EventBusManager.register(this); } - @Override - public void onApplicationEvent(@NonNull ApplicationEvent event) { + @Subscribe + public void handleDtpEvent(EventObject event) { try { if (event instanceof RefreshEvent) { - doRefresh(((RefreshEvent) event).getDtpProperties()); + RefreshEvent refreshEvent = (RefreshEvent) event; + doRefresh(refreshEvent.getDtpProperties()); } else if (event instanceof CollectEvent) { - doCollect(((CollectEvent) event).getDtpProperties()); + CollectEvent collectEvent = (CollectEvent) event; + doCollect(collectEvent.getDtpProperties()); } else if (event instanceof AlarmCheckEvent) { - doAlarmCheck(((AlarmCheckEvent) event).getDtpProperties()); + AlarmCheckEvent alarmCheckEvent = (AlarmCheckEvent) event; + doAlarmCheck(alarmCheckEvent.getDtpProperties()); } } catch (Exception e) { log.error("DynamicTp adapter, event handle failed.", e); } } - /** - * Compatible with lower versions of spring. - * - * @param sourceType sourceType - * @return true if support - */ - @Override - public boolean supportsSourceType(@Nullable Class sourceType) { - return true; - } - - /** - * Compatible with lower versions of spring. - * - * @return order - */ - @Override - public int getOrder() { - return LOWEST_PRECEDENCE; - } - /** * Do collect thread pool stats. * @param dtpProperties dtpProperties */ protected void doCollect(DtpProperties dtpProperties) { - val handlerMap = ApplicationContextHolder.getBeansOfType(DtpAdapter.class); - if (CollectionUtils.isEmpty(handlerMap)) { + val handlerMap = ContextManagerHelper.getBeansOfType(DtpAdapter.class); + if (MapUtils.isEmpty(handlerMap)) { return; } handlerMap.forEach((k, v) -> v.getMultiPoolStats().forEach(ps -> @@ -109,8 +83,8 @@ public class DtpAdapterListener implements GenericApplicationListener { * @param dtpProperties dtpProperties */ protected void doRefresh(DtpProperties dtpProperties) { - val handlerMap = ApplicationContextHolder.getBeansOfType(DtpAdapter.class); - if (CollectionUtils.isEmpty(handlerMap)) { + val handlerMap = ContextManagerHelper.getBeansOfType(DtpAdapter.class); + if (MapUtils.isEmpty(handlerMap)) { return; } handlerMap.forEach((k, v) -> v.refresh(dtpProperties)); @@ -121,13 +95,13 @@ public class DtpAdapterListener implements GenericApplicationListener { * @param dtpProperties dtpProperties */ protected void doAlarmCheck(DtpProperties dtpProperties) { - val handlerMap = ApplicationContextHolder.getBeansOfType(DtpAdapter.class); - if (CollectionUtils.isEmpty(handlerMap)) { + val handlerMap = ContextManagerHelper.getBeansOfType(DtpAdapter.class); + if (MapUtils.isEmpty(handlerMap)) { return; } handlerMap.forEach((k, v) -> { val executorWrapper = v.getExecutorWrappers(); - executorWrapper.forEach((kk, vv) -> AlarmManager.tryAlarmAsync(vv, SCHEDULE_NOTIFY_ITEMS)); + executorWrapper.forEach((kk, vv) -> AlarmManager.checkAndTryAlarmAsync(vv, NotifyItemTypeRegistry.getScheduleNotifyTypes())); }); } } diff --git a/adapter/adapter-dubbo/pom.xml b/adapter/adapter-dubbo/pom.xml index 3a85b9b0027bb2d9be8888604e0de3c1a814e829..c6d23f3618fab78bff4e5dcffc7f1222dd044158 100644 --- a/adapter/adapter-dubbo/pom.xml +++ b/adapter/adapter-dubbo/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-adapter-dubbo diff --git a/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/alibaba/AlibabaDubboDtpAdapter.java b/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/alibaba/AlibabaDubboDtpAdapter.java index b412f2c5466ef28161cf8a8ba99445ada6439852..f8011c17565620dfdf5a82b9b2ad715aaa584208 100644 --- a/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/alibaba/AlibabaDubboDtpAdapter.java +++ b/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/alibaba/AlibabaDubboDtpAdapter.java @@ -20,11 +20,14 @@ package org.dromara.dynamictp.adapter.dubbo.alibaba; import com.alibaba.dubbo.common.extension.ExtensionLoader; import com.alibaba.dubbo.common.store.DataStore; import com.alibaba.dubbo.remoting.transport.dispatcher.WrappedChannelHandler; +import com.google.common.eventbus.Subscribe; +import lombok.extern.slf4j.Slf4j; import lombok.val; import org.apache.commons.collections4.CollectionUtils; import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; +import org.dromara.dynamictp.common.event.CustomContextRefreshedEvent; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; import org.dromara.dynamictp.jvmti.JVMTI; import org.springframework.beans.factory.InitializingBean; @@ -42,6 +45,7 @@ import static com.alibaba.dubbo.common.Constants.EXECUTOR_SERVICE_COMPONENT_KEY; * @since 1.0.6 */ @SuppressWarnings("all") +@Slf4j public class AlibabaDubboDtpAdapter extends AbstractDtpAdapter implements InitializingBean { private static final String TP_PREFIX = "dubboTp"; @@ -50,18 +54,27 @@ public class AlibabaDubboDtpAdapter extends AbstractDtpAdapter implements Initia private final AtomicBoolean registered = new AtomicBoolean(false); + @Subscribe + @Override + public synchronized void onContextRefreshedEvent(CustomContextRefreshedEvent event) { + // do nothing, initialize in afterPropertiesSet + } + @Override public void afterPropertiesSet() throws Exception { - //从ApplicationReadyEvent改为ContextRefreshedEvent后, - //启动时无法dubbo获取线程池,这里直接每隔1s轮循,直至成功初始化线程池 + + // 从ApplicationReadyEvent改为ContextRefreshedEvent后, + // 启动时无法dubbo获取线程池,这里直接每隔1s轮循,直至成功初始化线程池 ExecutorService executor = Executors.newSingleThreadExecutor(); executor.submit(() -> { while (!registered.get()) { try { Thread.sleep(1000); - DtpProperties dtpProperties = ApplicationContextHolder.getBean(DtpProperties.class); - this.initialize(); - this.refresh(dtpProperties); + DtpProperties dtpProperties = ContextManagerHelper.getBean(DtpProperties.class); + initialize(); + afterInitialize(); + refresh(dtpProperties); + log.info("DynamicTp adapter, {} init end, executors {}", getTpPrefix(), executors.keySet()); } catch (Throwable e) { } } }); diff --git a/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/ApacheDubboDtpAdapter.java b/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/ApacheDubboDtpAdapter.java index 77e49980b17a6edc618bca8a42fe69b8f9d39c94..69b1752f6668bf6ea33753ef04e07211f83d2ed7 100644 --- a/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/ApacheDubboDtpAdapter.java +++ b/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/ApacheDubboDtpAdapter.java @@ -17,6 +17,7 @@ package org.dromara.dynamictp.adapter.dubbo.apache; +import com.google.common.eventbus.Subscribe; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.apache.commons.collections4.CollectionUtils; @@ -32,12 +33,14 @@ import org.apache.dubbo.config.spring.context.event.ServiceBeanExportedEvent; import org.apache.dubbo.remoting.transport.dispatcher.WrappedChannelHandler; import org.apache.dubbo.rpc.model.ApplicationModel; import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; +import org.dromara.dynamictp.common.event.CustomContextRefreshedEvent; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; import org.dromara.dynamictp.common.util.ReflectionUtil; -import org.dromara.dynamictp.core.support.ThreadPoolExecutorProxy; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; import org.dromara.dynamictp.jvmti.JVMTI; import org.springframework.context.ApplicationEvent; +import org.springframework.context.ApplicationListener; import java.util.Map; import java.util.Objects; @@ -57,21 +60,31 @@ import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY; */ @Slf4j @SuppressWarnings("all") -public class ApacheDubboDtpAdapter extends AbstractDtpAdapter { +public class ApacheDubboDtpAdapter extends AbstractDtpAdapter implements ApplicationListener { private static final String TP_PREFIX = "dubboTp"; private static final String EXECUTOR_SERVICE_COMPONENT_KEY = ExecutorService.class.getName(); + private static final String INTERNAL_EXECUTOR_SERVICE_COMPONENT_KEY = "INTERNAL_SERVICE_EXECUTOR"; + private static final String EXECUTOR_FIELD = "executor"; + @Subscribe + @Override + public synchronized void onContextRefreshedEvent(CustomContextRefreshedEvent event) { + // do nothing, initialize in onApplicationEvent + } + @Override public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ServiceBeanExportedEvent) { try { - DtpProperties dtpProperties = ApplicationContextHolder.getBean(DtpProperties.class); + DtpProperties dtpProperties = ContextManagerHelper.getBean(DtpProperties.class); initialize(); + afterInitialize(); refresh(dtpProperties); + log.info("DynamicTp adapter, {} init end, executors {}", getTpPrefix(), executors.keySet()); } catch (Exception e) { log.error("DynamicTp adapter, {} init failed.", getTpPrefix(), e); } @@ -93,31 +106,7 @@ public class ApacheDubboDtpAdapter extends AbstractDtpAdapter { super.initialize(); String currVersion = Version.getVersion(); if (DubboVersion.compare(DubboVersion.VERSION_2_7_5, currVersion) > 0) { - // 当前dubbo版本 < 2.7.5 - val handlers = JVMTI.getInstances(WrappedChannelHandler.class); - if (CollectionUtils.isEmpty(handlers)) { - return; - } - DataStore dataStore = ExtensionLoader.getExtensionLoader(DataStore.class).getDefaultExtension(); - handlers.forEach(handler -> { - //获取WrappedChannelHandler中的原始线程池 - val originExecutor = ReflectionUtil.getFieldValue(EXECUTOR_FIELD, handler); - if (!(originExecutor instanceof ExecutorService)) { - return; - } - URL url = handler.getUrl(); - //低版本跳过消费者线程池配置 - if (!CONSUMER_SIDE.equalsIgnoreCase(url.getParameter(SIDE_KEY))) { - String port = String.valueOf(url.getPort()); - String tpName = genTpName(port); - //增强原始线程池,替换为动态线程池代理 - enhanceOriginExecutor(tpName, (ThreadPoolExecutor) originExecutor, EXECUTOR_FIELD, handler); - //获取增强后的新动态线程池 - Object newExexutor = ReflectionUtil.getFieldValue(EXECUTOR_FIELD, handler); - //替换dataStore中的线程池 - dataStore.put(EXECUTOR_SERVICE_COMPONENT_KEY, port, newExexutor); - } - }); + handleLessThanV275(); return; } @@ -131,12 +120,16 @@ public class ApacheDubboDtpAdapter extends AbstractDtpAdapter { } val data = (ConcurrentMap>) ReflectionUtil.getFieldValue( - DefaultExecutorRepository.class, "data", executorRepository); + DefaultExecutorRepository.class, "data", executorRepository); if (Objects.isNull(data)) { return; } - Map executorMap = data.get(EXECUTOR_SERVICE_COMPONENT_KEY); + // 3.0.9 <= 当前dubbo版本 < 3.1.8时,执行线程池使用的是INTERNAL_SERVICE_EXECUTOR + boolean useInternalExecutorVersion = DubboVersion.compare(currVersion, DubboVersion.VERSION_3_0_9) >= 0 && + DubboVersion.compare(currVersion, DubboVersion.VERSION_3_1_8) < 0; + Map executorMap = useInternalExecutorVersion ? + data.get(INTERNAL_EXECUTOR_SERVICE_COMPONENT_KEY) : data.get(EXECUTOR_SERVICE_COMPONENT_KEY); if (MapUtils.isNotEmpty(executorMap)) { executorMap.forEach((k, v) -> { ThreadPoolExecutor proxy = getProxy(v); @@ -145,6 +138,36 @@ public class ApacheDubboDtpAdapter extends AbstractDtpAdapter { }); } } + + /** + * Handle versions less than 2.7.5 + */ + private void handleLessThanV275() { + val handlers = JVMTI.getInstances(WrappedChannelHandler.class); + if (CollectionUtils.isEmpty(handlers)) { + return; + } + DataStore dataStore = ExtensionLoader.getExtensionLoader(DataStore.class).getDefaultExtension(); + handlers.forEach(handler -> { + val originExecutor = ReflectionUtil.getFieldValue(EXECUTOR_FIELD, handler); + if (!(originExecutor instanceof ExecutorService)) { + return; + } + URL url = handler.getUrl(); + // 低版本跳过消费者线程池配置 + if (!CONSUMER_SIDE.equalsIgnoreCase(url.getParameter(SIDE_KEY))) { + String port = String.valueOf(url.getPort()); + String tpName = genTpName(port); + // 增强原始线程池,替换为动态线程池代理 + enhanceOriginExecutor(tpName, (ThreadPoolExecutor) originExecutor, EXECUTOR_FIELD, handler); + // 获取增强后的新动态线程池 + Object newExexutor = ReflectionUtil.getFieldValue(EXECUTOR_FIELD, handler); + // 替换dataStore中的线程池 + dataStore.put(EXECUTOR_SERVICE_COMPONENT_KEY, port, newExexutor); + } + }); + } + private ThreadPoolExecutor getProxy(Executor executor) { ThreadPoolExecutor proxy; if (executor instanceof EagerThreadPoolExecutor) { diff --git a/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/DubboVersion.java b/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/DubboVersion.java index bb4929aa52c74578a87ac5de28783364ae02877a..75730040267e87fa9d80de0fdc59608789c95c27 100644 --- a/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/DubboVersion.java +++ b/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/DubboVersion.java @@ -34,6 +34,10 @@ public class DubboVersion { public static final String VERSION_3_0_3 = "3.0.3"; + public static final String VERSION_3_0_9 = "3.0.9"; + + public static final String VERSION_3_1_8 = "3.1.8"; + /** * Compare versions * @return the value {@code 0} if {@code version1 == version2}; diff --git a/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/EagerThreadPoolExecutorProxy.java b/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/EagerThreadPoolExecutorProxy.java index 622ccfe6809c1f426ab80cf8c93b758ae5a367a0..f32765c2f9c78d13770af38ed77417ede494c194 100644 --- a/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/EagerThreadPoolExecutorProxy.java +++ b/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/EagerThreadPoolExecutorProxy.java @@ -19,6 +19,7 @@ package org.dromara.dynamictp.adapter.dubbo.apache; import org.apache.dubbo.common.threadpool.support.eager.EagerThreadPoolExecutor; import org.apache.dubbo.common.threadpool.support.eager.TaskQueue; +import org.dromara.dynamictp.common.util.ExecutorUtil; import org.dromara.dynamictp.core.aware.AwareManager; import org.dromara.dynamictp.core.aware.RejectHandlerAware; import org.dromara.dynamictp.core.aware.TaskEnhanceAware; @@ -44,13 +45,14 @@ public class EagerThreadPoolExecutorProxy extends EagerThreadPoolExecutor implem /** * Reject handler type. */ - private final String rejectHandlerType; + private String rejectHandlerType; public EagerThreadPoolExecutorProxy(EagerThreadPoolExecutor executor) { super(executor.getCorePoolSize(), executor.getMaximumPoolSize(), executor.getKeepAliveTime(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS, (TaskQueue) executor.getQueue(), executor.getThreadFactory(), executor.getRejectedExecutionHandler()); + allowCoreThreadTimeOut(executor.allowsCoreThreadTimeOut()); this.rejectHandlerType = getRejectedExecutionHandler().getClass().getSimpleName(); setRejectedExecutionHandler(RejectHandlerGetter.getProxy(getRejectedExecutionHandler())); ((TaskQueue) getQueue()).setExecutor(this); @@ -65,14 +67,15 @@ public class EagerThreadPoolExecutorProxy extends EagerThreadPoolExecutor implem @Override protected void beforeExecute(Thread t, Runnable r) { - super.beforeExecute(t, r); AwareManager.beforeExecute(this, t, r); + super.beforeExecute(t, r); } @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); AwareManager.afterExecute(this, r, t); + ExecutorUtil.tryExecAfterExecute(r, t); } @Override @@ -89,4 +92,9 @@ public class EagerThreadPoolExecutorProxy extends EagerThreadPoolExecutor implem public String getRejectHandlerType() { return rejectHandlerType; } + + @Override + public void setRejectHandlerType(String rejectHandlerType) { + this.rejectHandlerType = rejectHandlerType; + } } diff --git a/adapter/adapter-grpc/pom.xml b/adapter/adapter-grpc/pom.xml index 24fa4a61d5a994cefa223c9d872f0ea4cedf954c..fa64ca84d5004713f6edaf455e71ee1fde423ced 100644 --- a/adapter/adapter-grpc/pom.xml +++ b/adapter/adapter-grpc/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-adapter-grpc diff --git a/adapter/adapter-grpc/src/main/java/org/dromara/dynamictp/adapter/grpc/GrpcDtpAdapter.java b/adapter/adapter-grpc/src/main/java/org/dromara/dynamictp/adapter/grpc/GrpcDtpAdapter.java index 5b76765f10cb36be27e316eb00896a32a0a4af48..64f8f03cee85242517613a469235b3578d5bf14b 100644 --- a/adapter/adapter-grpc/src/main/java/org/dromara/dynamictp/adapter/grpc/GrpcDtpAdapter.java +++ b/adapter/adapter-grpc/src/main/java/org/dromara/dynamictp/adapter/grpc/GrpcDtpAdapter.java @@ -26,6 +26,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; import org.dromara.dynamictp.common.properties.DtpProperties; import org.dromara.dynamictp.common.util.ReflectionUtil; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; import org.dromara.dynamictp.jvmti.JVMTI; import java.net.InetSocketAddress; @@ -80,7 +81,10 @@ public class GrpcDtpAdapter extends AbstractDtpAdapter { } val executor = (Executor) ReflectionUtil.getFieldValue(ServerImpl.class, EXECUTOR_FIELD, serverImpl); if (Objects.nonNull(executor) && executor instanceof ThreadPoolExecutor) { - enhanceOriginExecutor(genTpName(key), (ThreadPoolExecutor) executor, EXECUTOR_FIELD, serverImpl); + String tpName = genTpName(key); + val proxy = new ThreadPoolExecutorProxy((ThreadPoolExecutor) executor); + // don't shutdown the origin executor, because it's a shared executor, and may be used by other components + enhanceOriginExecutorWithoutFinalize(tpName, proxy, EXECUTOR_FIELD, serverImpl); } } } diff --git a/adapter/adapter-hystrix/pom.xml b/adapter/adapter-hystrix/pom.xml index b36c372aa93eead707279244a902bbfc86ee21ef..c9b436d7098a6918f9aab74d624da94576cd62a2 100644 --- a/adapter/adapter-hystrix/pom.xml +++ b/adapter/adapter-hystrix/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-adapter-hystrix diff --git a/adapter/adapter-hystrix/src/main/java/org/dromara/dynamictp/adapter/hystrix/DtpHystrixConcurrencyStrategy.java b/adapter/adapter-hystrix/src/main/java/org/dromara/dynamictp/adapter/hystrix/DtpHystrixConcurrencyStrategy.java new file mode 100644 index 0000000000000000000000000000000000000000..6268ece839d4714417bec7d97d4ec32ae08c9d9f --- /dev/null +++ b/adapter/adapter-hystrix/src/main/java/org/dromara/dynamictp/adapter/hystrix/DtpHystrixConcurrencyStrategy.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.adapter.hystrix; + +import com.netflix.hystrix.HystrixThreadPoolKey; +import com.netflix.hystrix.HystrixThreadPoolProperties; +import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy; +import com.netflix.hystrix.strategy.properties.HystrixProperty; +import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; + +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * DtpHystrixConcurrencyStrategy related + * + * @author devin + * @since 1.2.2 + */ +@Slf4j +public class DtpHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy { + + private final HystrixConcurrencyStrategy delegate; + private final HystrixDtpAdapter hystrixDtpAdapter; + + public DtpHystrixConcurrencyStrategy(HystrixConcurrencyStrategy delegate, HystrixDtpAdapter hystrixDtpAdapter) { + this.delegate = delegate; + this.hystrixDtpAdapter = hystrixDtpAdapter; + } + + @Override + public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey, + HystrixProperty corePoolSize, + HystrixProperty maximumPoolSize, + HystrixProperty keepAliveTime, + TimeUnit unit, + BlockingQueue workQueue) { + ThreadPoolExecutor originalExecutor = delegate.getThreadPool( + threadPoolKey, corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); + ThreadPoolExecutorProxy proxy = new ThreadPoolExecutorProxy(originalExecutor); + hystrixDtpAdapter.registerExecutor(threadPoolKey.name(), proxy, originalExecutor); + return proxy; + } + + @Override + public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey, HystrixThreadPoolProperties threadPoolProperties) { + ThreadPoolExecutor originalExecutor = delegate.getThreadPool(threadPoolKey, threadPoolProperties); + ThreadPoolExecutorProxy proxy = new ThreadPoolExecutorProxy(originalExecutor); + hystrixDtpAdapter.registerExecutor(threadPoolKey.name(), proxy, originalExecutor); + return proxy; + } + + @Override + public BlockingQueue getBlockingQueue(int maxQueueSize) { + return delegate.getBlockingQueue(maxQueueSize); + } + + @Override + public Callable wrapCallable(Callable callable) { + return delegate.wrapCallable(callable); + } +} diff --git a/adapter/adapter-hystrix/src/main/java/org/dromara/dynamictp/adapter/hystrix/DtpMetricsPublisherThreadPool.java b/adapter/adapter-hystrix/src/main/java/org/dromara/dynamictp/adapter/hystrix/DtpMetricsPublisherThreadPool.java deleted file mode 100644 index 71237abefff1b0aafeccdb52efee6315414c0ecd..0000000000000000000000000000000000000000 --- a/adapter/adapter-hystrix/src/main/java/org/dromara/dynamictp/adapter/hystrix/DtpMetricsPublisherThreadPool.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.dromara.dynamictp.adapter.hystrix; - -import com.netflix.hystrix.HystrixThreadPoolKey; -import com.netflix.hystrix.HystrixThreadPoolMetrics; -import com.netflix.hystrix.HystrixThreadPoolProperties; -import com.netflix.hystrix.strategy.metrics.HystrixMetricsPublisherThreadPool; -import com.netflix.hystrix.strategy.properties.HystrixProperty; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.dromara.dynamictp.common.entity.TpExecutorProps; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; -import org.dromara.dynamictp.common.util.ReflectionUtil; - -import java.util.Objects; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; - -import static com.netflix.hystrix.strategy.properties.HystrixPropertiesChainedProperty.forBoolean; -import static com.netflix.hystrix.strategy.properties.HystrixPropertiesChainedProperty.forInteger; - -/** - * DtpMetricsPublisherThreadPool related - * - * @author yanhom - * @since 1.0.8 - */ -@Slf4j -public class DtpMetricsPublisherThreadPool implements HystrixMetricsPublisherThreadPool { - - private static final String PROPERTY_PREFIX = "hystrix"; - private static final int DEFAULT_CORE_SIZE = 10; - private static final int DEFAULT_MAXIMUM_SIZE = 10; - private static final int DEFAULT_KEEP_ALIVE_TIME_MINUTES = 1; - - private final AtomicBoolean init = new AtomicBoolean(false); - - private final HystrixThreadPoolKey threadPoolKey; - private final HystrixThreadPoolMetrics metrics; - private final HystrixThreadPoolProperties threadPoolProperties; - private final HystrixMetricsPublisherThreadPool metricsPublisherForThreadPool; - - public DtpMetricsPublisherThreadPool( - final HystrixThreadPoolKey threadPoolKey, - final HystrixThreadPoolMetrics metrics, - final HystrixThreadPoolProperties threadPoolProperties, - final HystrixMetricsPublisherThreadPool metricsPublisherForThreadPool) { - this.threadPoolKey = threadPoolKey; - this.metrics = metrics; - this.threadPoolProperties = threadPoolProperties; - this.metricsPublisherForThreadPool = metricsPublisherForThreadPool; - } - - @Override - public void initialize() { - metricsPublisherForThreadPool.initialize(); - HystrixDtpAdapter hystrixTpHandler = ApplicationContextHolder.getBean(HystrixDtpAdapter.class); - hystrixTpHandler.cacheMetricsPublisher(threadPoolKey.name(), this); - hystrixTpHandler.register(threadPoolKey.name(), metrics); - } - - public void refreshProperties(TpExecutorProps props) { - if (Objects.isNull(props)) { - return; - } - - try { - if (!Objects.equals(threadPoolProperties.coreSize().get(), props.getCorePoolSize())) { - val corePoolSize = getProperty(threadPoolKey, "coreSize", - props.getCorePoolSize(), DEFAULT_CORE_SIZE); - ReflectionUtil.setFieldValue(HystrixThreadPoolProperties.class, - "corePoolSize", threadPoolProperties, corePoolSize); - } - - if (!Objects.equals(threadPoolProperties.maximumSize().get(), props.getMaximumPoolSize())) { - val maxPoolSize = getProperty(threadPoolKey, "maximumSize", - props.getMaximumPoolSize(), DEFAULT_MAXIMUM_SIZE); - ReflectionUtil.setFieldValue(HystrixThreadPoolProperties.class, - "maximumPoolSize", threadPoolProperties, maxPoolSize); - } - - val keepAliveTimeMinutes = (int) TimeUnit.SECONDS.toMinutes(props.getKeepAliveTime()); - if (!Objects.equals(threadPoolProperties.keepAliveTimeMinutes().get(), keepAliveTimeMinutes)) { - val keepAliveTimeProperty = getProperty(threadPoolKey, - "keepAliveTimeMinutes", keepAliveTimeMinutes, DEFAULT_KEEP_ALIVE_TIME_MINUTES); - ReflectionUtil.setFieldValue(HystrixThreadPoolProperties.class, - "keepAliveTime", threadPoolProperties, keepAliveTimeProperty); - } - - if (init.compareAndSet(false, true)) { - val allowSetMax = getProperty(threadPoolKey, - "allowMaximumSizeToDivergeFromCoreSize", true, true); - ReflectionUtil.setFieldValue(HystrixThreadPoolProperties.class, - "allowMaximumSizeToDivergeFromCoreSize", threadPoolProperties, allowSetMax); - } - } catch (IllegalAccessException e) { - log.error("DynamicTp hystrix adapter, reset hystrix threadPool properties failed.", e); - } - } - - private static HystrixProperty getProperty(HystrixThreadPoolKey key, - String instanceProperty, - Integer builderOverrideValue, - Integer defaultValue) { - return forInteger() - .add(getPropertyName(key.name(), instanceProperty), builderOverrideValue) - .add(getDefaultPropertyName(instanceProperty), defaultValue) - .build(); - } - - private static HystrixProperty getProperty(HystrixThreadPoolKey key, - String instanceProperty, - Boolean builderOverrideValue, - Boolean defaultValue) { - return forBoolean() - .add(getPropertyName(key.name(), instanceProperty), builderOverrideValue) - .add(getDefaultPropertyName(instanceProperty), defaultValue) - .build(); - } - - private static String getPropertyName(String key, String instanceProperty) { - return PROPERTY_PREFIX + ".threadpool." + key + "." + instanceProperty; - } - - private static String getDefaultPropertyName(String instanceProperty) { - return PROPERTY_PREFIX + ".threadpool.default." + instanceProperty; - } -} diff --git a/adapter/adapter-hystrix/src/main/java/org/dromara/dynamictp/adapter/hystrix/HystrixDtpAdapter.java b/adapter/adapter-hystrix/src/main/java/org/dromara/dynamictp/adapter/hystrix/HystrixDtpAdapter.java index 01f7131f56ff428c2b570b04fe62d76b5bbdae3b..16a55007238d650ec6ccc509f377087314c76109 100644 --- a/adapter/adapter-hystrix/src/main/java/org/dromara/dynamictp/adapter/hystrix/HystrixDtpAdapter.java +++ b/adapter/adapter-hystrix/src/main/java/org/dromara/dynamictp/adapter/hystrix/HystrixDtpAdapter.java @@ -17,8 +17,6 @@ package org.dromara.dynamictp.adapter.hystrix; -import com.google.common.collect.Maps; -import com.netflix.hystrix.HystrixThreadPoolMetrics; import com.netflix.hystrix.strategy.HystrixPlugins; import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy; import com.netflix.hystrix.strategy.eventnotifier.HystrixEventNotifier; @@ -28,16 +26,13 @@ import com.netflix.hystrix.strategy.properties.HystrixPropertiesStrategy; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; -import org.dromara.dynamictp.common.entity.NotifyPlatform; import org.dromara.dynamictp.common.entity.TpExecutorProps; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; import org.dromara.dynamictp.common.util.StreamUtil; import org.dromara.dynamictp.core.support.ExecutorWrapper; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; -import java.util.List; -import java.util.Map; -import java.util.Objects; import java.util.concurrent.ThreadPoolExecutor; /** @@ -49,48 +44,31 @@ import java.util.concurrent.ThreadPoolExecutor; @Slf4j public class HystrixDtpAdapter extends AbstractDtpAdapter { - private static final String TP_PREFIX = "hystrixTp"; - - private static final String THREAD_POOL_FIELD = "threadPool"; - - private static final Map METRICS_PUBLISHERS = Maps.newHashMap(); + public static final String TP_PREFIX = "hystrixTp"; @Override public void refresh(DtpProperties dtpProperties) { refresh(dtpProperties.getHystrixTp(), dtpProperties.getPlatforms()); } - @Override - public void refresh(ExecutorWrapper executorWrapper, List platforms, TpExecutorProps props) { - super.refresh(executorWrapper, platforms, props); - val metricsPublisher = METRICS_PUBLISHERS.get(executorWrapper.getThreadPoolName()); - if (Objects.isNull(metricsPublisher)) { - return; - } - metricsPublisher.refreshProperties(props); - } - @Override protected String getTpPrefix() { return TP_PREFIX; } - - public void register(String poolName, HystrixThreadPoolMetrics metrics) { - ThreadPoolExecutor threadPoolExecutor = metrics.getThreadPool(); + + public void registerExecutor(String threadPoolKey, ThreadPoolExecutorProxy proxy, ThreadPoolExecutor original) { + String poolName = getTpPrefix() + "#" + threadPoolKey; if (executors.containsKey(poolName)) { return; } + ExecutorWrapper wrapper = new ExecutorWrapper(poolName, proxy); + executors.put(poolName, wrapper); + shutdownOriginalExecutor(original); - DtpProperties dtpProperties = ApplicationContextHolder.getBean(DtpProperties.class); + DtpProperties dtpProperties = ContextManagerHelper.getBean(DtpProperties.class); val prop = StreamUtil.toMap(dtpProperties.getHystrixTp(), TpExecutorProps::getThreadPoolName); - String tpName = TP_PREFIX + "#" + poolName; - enhanceOriginExecutor(tpName, threadPoolExecutor, THREAD_POOL_FIELD, metrics); - refresh(executors.get(tpName), dtpProperties.getPlatforms(), prop.get(tpName)); - log.info("DynamicTp adapter, {} init end, executor {}", getTpPrefix(), executors.get(tpName)); - } - - public void cacheMetricsPublisher(String poolName, DtpMetricsPublisherThreadPool metricsPublisher) { - METRICS_PUBLISHERS.putIfAbsent(poolName, metricsPublisher); + refresh(wrapper, dtpProperties.getPlatforms(), prop.get(poolName)); + log.info("DynamicTp adapter, executor [{}] enhanced success.", poolName); } @Override @@ -104,8 +82,8 @@ public class HystrixDtpAdapter extends AbstractDtpAdapter { HystrixPlugins.reset(); - HystrixPlugins.getInstance().registerMetricsPublisher(new DtpHystrixMetricsPublisher(metricsPublisher)); - HystrixPlugins.getInstance().registerConcurrencyStrategy(concurrencyStrategy); + HystrixPlugins.getInstance().registerMetricsPublisher(metricsPublisher); + HystrixPlugins.getInstance().registerConcurrencyStrategy(new DtpHystrixConcurrencyStrategy(concurrencyStrategy, this)); HystrixPlugins.getInstance().registerEventNotifier(eventNotifier); HystrixPlugins.getInstance().registerPropertiesStrategy(propertiesStrategy); HystrixPlugins.getInstance().registerCommandExecutionHook(commandExecutionHook); diff --git a/adapter/adapter-liteflow/pom.xml b/adapter/adapter-liteflow/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..cde4aee18eb61ff97a28892f14a3f7ce32ba84ba --- /dev/null +++ b/adapter/adapter-liteflow/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + org.dromara.dynamictp + dynamic-tp-adapter + 1.2.1 + ../pom.xml + + dynamic-tp-adapter-liteflow + + + + org.dromara.dynamictp + dynamic-tp-adapter-common + + + + com.yomahub + liteflow-core + true + + + diff --git a/adapter/adapter-liteflow/src/main/java/org/dromara/dynamictp/adapter/liteflow/LiteflowDtpAdapter.java b/adapter/adapter-liteflow/src/main/java/org/dromara/dynamictp/adapter/liteflow/LiteflowDtpAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..ef38ac642f4208330b1610db43f6561ef4960e9a --- /dev/null +++ b/adapter/adapter-liteflow/src/main/java/org/dromara/dynamictp/adapter/liteflow/LiteflowDtpAdapter.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.adapter.liteflow; + +import com.google.common.collect.Maps; +import com.yomahub.liteflow.thread.ExecutorHelper; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.apache.commons.collections4.MapUtils; +import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; +import org.dromara.dynamictp.common.properties.DtpProperties; +import org.dromara.dynamictp.common.util.ReflectionUtil; +import org.dromara.dynamictp.core.support.ExecutorWrapper; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; + +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * LiteflowDtpAdapter related + * + * @author yanhom + * @since 1.1.9 + */ +@Slf4j +@SuppressWarnings("all") +public class LiteflowDtpAdapter extends AbstractDtpAdapter { + + private static final String TP_PREFIX = "liteflowTp"; + + private static final String EXECUTOR_MAP_FIELD = "executorServiceMap"; + + @Override + protected String getTpPrefix() { + return TP_PREFIX; + } + + @Override + public void refresh(DtpProperties dtpProperties) { + refresh(dtpProperties.getLiteflowTp(), dtpProperties.getPlatforms()); + } + + @Override + protected void initialize() { + super.initialize(); + val executorHelper = ExecutorHelper.loadInstance(); + val executorMap = (Map) ReflectionUtil.getFieldValue( + ExecutorHelper.class, EXECUTOR_MAP_FIELD, executorHelper); + if (MapUtils.isEmpty(executorMap)) { + log.warn("Cannot find instances of type ExecutorService."); + return; + } + Map newExecutorMap = Maps.newHashMap(); + executorMap.forEach((k, v) -> { + String key = k.substring(k.lastIndexOf(".") + 1); + val tpName = TP_PREFIX + "#" + key; + ThreadPoolExecutor executor; + if (v instanceof ThreadPoolExecutor) { + executor = (ThreadPoolExecutor) v; + } else { + executor = (ThreadPoolExecutor) ReflectionUtil.getFieldValue("executorService", v); + } + ThreadPoolExecutorProxy proxy = new ThreadPoolExecutorProxy(executor); + newExecutorMap.put(k, proxy); + executors.put(tpName, new ExecutorWrapper(tpName, proxy)); + }); + ReflectionUtil.setFieldValue(EXECUTOR_MAP_FIELD, executorHelper, newExecutorMap); + executorMap.forEach((k, v) -> shutdownOriginalExecutor(v)); + } +} diff --git a/adapter/adapter-motan/pom.xml b/adapter/adapter-motan/pom.xml index 60cf1418cb20e271b9bead5cec61ba5721149db8..6f5b3fdb6fda77f7faab1f8a51a7da20890b1257 100644 --- a/adapter/adapter-motan/pom.xml +++ b/adapter/adapter-motan/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-adapter-motan @@ -33,6 +33,12 @@ motan-springsupport true + + + org.springframework + spring-context + true + diff --git a/adapter/adapter-motan/src/main/java/org/dromara/dynamictp/adapter/motan/MotanDtpAdapter.java b/adapter/adapter-motan/src/main/java/org/dromara/dynamictp/adapter/motan/MotanDtpAdapter.java index 2f66ded94fc437f839cb28d2808a97b9e2729f3e..80965eccfd3c06641835a5381b5e15bf991f4114 100644 --- a/adapter/adapter-motan/src/main/java/org/dromara/dynamictp/adapter/motan/MotanDtpAdapter.java +++ b/adapter/adapter-motan/src/main/java/org/dromara/dynamictp/adapter/motan/MotanDtpAdapter.java @@ -28,8 +28,8 @@ import lombok.val; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; import org.dromara.dynamictp.common.util.ReflectionUtil; import java.util.List; @@ -65,7 +65,7 @@ public class MotanDtpAdapter extends AbstractDtpAdapter { protected void initialize() { super.initialize(); - val beans = ApplicationContextHolder.getBeansOfType(ServiceConfigBean.class); + val beans = ContextManagerHelper.getBeansOfType(ServiceConfigBean.class); if (MapUtils.isEmpty(beans)) { log.warn("Cannot find beans of type ServiceConfigBean."); return; @@ -89,12 +89,8 @@ public class MotanDtpAdapter extends AbstractDtpAdapter { if (Objects.nonNull(executor)) { StandardThreadExecutorProxy proxy = new StandardThreadExecutorProxy(executor); String tpName = TP_PREFIX + "#" + nettyServer.getUrl().getPort(); - try { - ReflectionUtil.setFieldValue(EXECUTOR_FIELD, nettyServer, proxy); - putAndFinalize(tpName, executor, proxy); - } catch (IllegalAccessException ex) { - log.error("DynamicTp adapter, enhance {} failed.", tpName, ex); - } + ReflectionUtil.setFieldValue(EXECUTOR_FIELD, nettyServer, proxy); + putAndFinalize(tpName, executor, proxy); } }); }); diff --git a/adapter/adapter-motan/src/main/java/org/dromara/dynamictp/adapter/motan/StandardThreadExecutorProxy.java b/adapter/adapter-motan/src/main/java/org/dromara/dynamictp/adapter/motan/StandardThreadExecutorProxy.java index 1f852d05766ce599c175cf9f2245fd8f9ae40708..e542d812533d1b0e55f590431129c48c41b54ed3 100644 --- a/adapter/adapter-motan/src/main/java/org/dromara/dynamictp/adapter/motan/StandardThreadExecutorProxy.java +++ b/adapter/adapter-motan/src/main/java/org/dromara/dynamictp/adapter/motan/StandardThreadExecutorProxy.java @@ -18,6 +18,7 @@ package org.dromara.dynamictp.adapter.motan; import com.weibo.api.motan.transport.netty.StandardThreadExecutor; +import org.dromara.dynamictp.common.util.ExecutorUtil; import org.dromara.dynamictp.common.util.ReflectionUtil; import org.dromara.dynamictp.core.aware.AwareManager; import org.dromara.dynamictp.core.aware.RejectHandlerAware; @@ -42,22 +43,19 @@ public class StandardThreadExecutorProxy extends StandardThreadExecutor implemen */ private List taskWrappers; - private final String rejectHandlerType; + private String rejectHandlerType; public StandardThreadExecutorProxy(StandardThreadExecutor executor) { super(executor.getCorePoolSize(), executor.getMaximumPoolSize(), executor.getKeepAliveTime(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS, executor.getMaxSubmittedTaskCount() - executor.getMaximumPoolSize(), executor.getThreadFactory(), executor.getRejectedExecutionHandler()); + allowCoreThreadTimeOut(executor.allowsCoreThreadTimeOut()); RejectedExecutionHandler handler = getRejectedExecutionHandler(); this.rejectHandlerType = handler.getClass().getSimpleName(); setRejectedExecutionHandler(RejectHandlerGetter.getProxy(handler)); if (EXECUTOR_QUEUE.equals(executor.getQueue().getClass().getSimpleName())) { - try { - ReflectionUtil.setFieldValue("threadPoolExecutor", executor.getQueue(), this); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } + ReflectionUtil.setFieldValue("threadPoolExecutor", executor.getQueue(), this); } } @@ -70,14 +68,15 @@ public class StandardThreadExecutorProxy extends StandardThreadExecutor implemen @Override protected void beforeExecute(Thread t, Runnable r) { - super.beforeExecute(t, r); AwareManager.beforeExecute(this, t, r); + super.beforeExecute(t, r); } @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); AwareManager.afterExecute(this, r, t); + ExecutorUtil.tryExecAfterExecute(r, t); } @Override @@ -94,4 +93,9 @@ public class StandardThreadExecutorProxy extends StandardThreadExecutor implemen public String getRejectHandlerType() { return rejectHandlerType; } + + @Override + public void setRejectHandlerType(String rejectHandlerType) { + this.rejectHandlerType = rejectHandlerType; + } } diff --git a/adapter/adapter-okhttp3/pom.xml b/adapter/adapter-okhttp3/pom.xml index a64f2603d2266714db71e2b41ee7d1b638400493..ad914a7aac8fa4232332f507e5563281edc366d7 100644 --- a/adapter/adapter-okhttp3/pom.xml +++ b/adapter/adapter-okhttp3/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-adapter-okhttp3 @@ -21,6 +21,7 @@ okhttp true + diff --git a/adapter/adapter-okhttp3/src/main/java/org/dromara/dynamictp/adapter/okhttp3/Okhttp3DtpAdapter.java b/adapter/adapter-okhttp3/src/main/java/org/dromara/dynamictp/adapter/okhttp3/Okhttp3DtpAdapter.java index 570933aa281936c0270e30e37ec241513013ff77..a30e03c24b0c349fe2b999e84d1849916d5c1822 100644 --- a/adapter/adapter-okhttp3/src/main/java/org/dromara/dynamictp/adapter/okhttp3/Okhttp3DtpAdapter.java +++ b/adapter/adapter-okhttp3/src/main/java/org/dromara/dynamictp/adapter/okhttp3/Okhttp3DtpAdapter.java @@ -21,10 +21,14 @@ import lombok.extern.slf4j.Slf4j; import lombok.val; import okhttp3.OkHttpClient; import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.reflect.FieldUtils; import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; +import org.dromara.dynamictp.common.util.ReflectionUtil; +import java.lang.reflect.Field; +import java.util.Objects; import java.util.concurrent.ThreadPoolExecutor; /** @@ -40,6 +44,8 @@ public class Okhttp3DtpAdapter extends AbstractDtpAdapter { private static final String EXECUTOR_SERVICE_FIELD = "executorService"; + private static final String EXECUTOR_SERVICE_FIELD_ALTERNATIVE = "executorServiceOrNull"; + @Override public void refresh(DtpProperties dtpProperties) { refresh(dtpProperties.getOkhttp3Tp(), dtpProperties.getPlatforms()); @@ -53,16 +59,23 @@ public class Okhttp3DtpAdapter extends AbstractDtpAdapter { @Override protected void initialize() { super.initialize(); - val beans = ApplicationContextHolder.getBeansOfType(OkHttpClient.class); + val beans = ContextManagerHelper.getBeansOfType(OkHttpClient.class); if (MapUtils.isEmpty(beans)) { log.warn("Cannot find beans of type OkHttpClient."); return; } beans.forEach((k, v) -> { - val executor = v.dispatcher().executorService(); - if (executor instanceof ThreadPoolExecutor) { - enhanceOriginExecutor(genTpName(k), (ThreadPoolExecutor) executor, EXECUTOR_SERVICE_FIELD, v.dispatcher()); + val dispatcher = v.dispatcher(); + val executor = dispatcher.executorService(); + if (!(executor instanceof ThreadPoolExecutor)) { + return; + } + + Field field = FieldUtils.getField(dispatcher.getClass(), EXECUTOR_SERVICE_FIELD, true); + if (Objects.isNull(field)) { + field = ReflectionUtil.getField(dispatcher.getClass(), EXECUTOR_SERVICE_FIELD_ALTERNATIVE); } + enhanceOriginExecutor(genTpName(k), (ThreadPoolExecutor) executor, field, dispatcher); }); } diff --git a/adapter/adapter-rabbitmq/pom.xml b/adapter/adapter-rabbitmq/pom.xml index 45995c7f5aa8906c6e204368c7c26bdf7a09be8e..56bfc1319bcf09130230e2b4a550d9f3351134c3 100644 --- a/adapter/adapter-rabbitmq/pom.xml +++ b/adapter/adapter-rabbitmq/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-adapter-rabbitmq diff --git a/adapter/adapter-rabbitmq/src/main/java/org/dromara/dynamictp/adapter/rabbitmq/RabbitMqDtpAdapter.java b/adapter/adapter-rabbitmq/src/main/java/org/dromara/dynamictp/adapter/rabbitmq/RabbitMqDtpAdapter.java index 5467c4376083faaaeef8a9914375fc0faf3eefa7..f2968ceb6cc135f58611530ce8117e2382423699 100644 --- a/adapter/adapter-rabbitmq/src/main/java/org/dromara/dynamictp/adapter/rabbitmq/RabbitMqDtpAdapter.java +++ b/adapter/adapter-rabbitmq/src/main/java/org/dromara/dynamictp/adapter/rabbitmq/RabbitMqDtpAdapter.java @@ -21,8 +21,8 @@ import lombok.extern.slf4j.Slf4j; import lombok.val; import org.apache.commons.collections4.MapUtils; import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; import org.dromara.dynamictp.common.util.ReflectionUtil; import org.springframework.amqp.rabbit.connection.AbstractConnectionFactory; @@ -58,7 +58,7 @@ public class RabbitMqDtpAdapter extends AbstractDtpAdapter { protected void initialize() { super.initialize(); - val beans = ApplicationContextHolder.getBeansOfType(AbstractConnectionFactory.class); + val beans = ContextManagerHelper.getBeansOfType(AbstractConnectionFactory.class); if (MapUtils.isEmpty(beans)) { log.warn("Cannot find beans of type AbstractConnectionFactory."); return; diff --git a/adapter/adapter-rocketmq/pom.xml b/adapter/adapter-rocketmq/pom.xml index 2bfe5e833714f6c7b3f8bd04ccc5e98ec731be2e..fddd24c349c9d7dd6ccdd62d198b853a64b26f60 100644 --- a/adapter/adapter-rocketmq/pom.xml +++ b/adapter/adapter-rocketmq/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-adapter-rocketmq diff --git a/adapter/adapter-rocketmq/src/main/java/org/dromara/dynamictp/adapter/rocketmq/AliyunOnsRocketMqAdapter.java b/adapter/adapter-rocketmq/src/main/java/org/dromara/dynamictp/adapter/rocketmq/AliyunOnsRocketMqAdapter.java index d46ad3fb8c592d3c2a407a712ff4617587a2efb9..263a833e2dbc1a7c7805853019ba378a21880803 100644 --- a/adapter/adapter-rocketmq/src/main/java/org/dromara/dynamictp/adapter/rocketmq/AliyunOnsRocketMqAdapter.java +++ b/adapter/adapter-rocketmq/src/main/java/org/dromara/dynamictp/adapter/rocketmq/AliyunOnsRocketMqAdapter.java @@ -27,8 +27,8 @@ import lombok.extern.slf4j.Slf4j; import lombok.val; import org.apache.commons.collections4.MapUtils; import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; import org.dromara.dynamictp.common.util.ReflectionUtil; import java.util.Objects; @@ -63,7 +63,7 @@ public class AliyunOnsRocketMqAdapter extends AbstractDtpAdapter { private void adaptConsumerExecutors() { // get consumer beans - val beans = ApplicationContextHolder.getBeansOfType(Consumer.class); + val beans = ContextManagerHelper.getBeansOfType(Consumer.class); if (MapUtils.isEmpty(beans)) { log.warn("Cannot find beans of type Consumer."); return; diff --git a/adapter/adapter-rocketmq/src/main/java/org/dromara/dynamictp/adapter/rocketmq/RocketMqDtpAdapter.java b/adapter/adapter-rocketmq/src/main/java/org/dromara/dynamictp/adapter/rocketmq/RocketMqDtpAdapter.java index b8d6c34cae4dc7cfb282dad67f9a33fc024e80ba..6f07aa7d32c3a0c24e520d2023109cdbdfddb055 100644 --- a/adapter/adapter-rocketmq/src/main/java/org/dromara/dynamictp/adapter/rocketmq/RocketMqDtpAdapter.java +++ b/adapter/adapter-rocketmq/src/main/java/org/dromara/dynamictp/adapter/rocketmq/RocketMqDtpAdapter.java @@ -29,9 +29,8 @@ import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; import org.dromara.dynamictp.common.properties.DtpProperties; import org.dromara.dynamictp.common.util.ReflectionUtil; -import org.dromara.dynamictp.core.support.ThreadPoolExecutorProxy; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; import org.dromara.dynamictp.jvmti.JVMTI; -import org.springframework.util.ReflectionUtils; import java.util.Objects; import java.util.concurrent.ThreadPoolExecutor; @@ -48,7 +47,6 @@ import java.util.concurrent.ThreadPoolExecutor; public class RocketMqDtpAdapter extends AbstractDtpAdapter { private static final String TP_PREFIX = "rocketMqTp"; - private static final String CONSUME_EXECUTOR_FIELD = "consumeExecutor"; @Override @@ -69,7 +67,6 @@ public class RocketMqDtpAdapter extends AbstractDtpAdapter { } public void adaptConsumerExecutors() { - val beans = JVMTI.getInstances(DefaultMQPushConsumer.class); if (CollectionUtils.isEmpty(beans)) { log.warn("Cannot find beans of type DefaultMQPushConsumer."); @@ -82,7 +79,8 @@ public class RocketMqDtpAdapter extends AbstractDtpAdapter { continue; } val consumeMessageService = pushConsumer.getConsumeMessageService(); - ThreadPoolExecutor executor = (ThreadPoolExecutor) ReflectionUtil.getFieldValue(CONSUME_EXECUTOR_FIELD, consumeMessageService); + ThreadPoolExecutor executor = (ThreadPoolExecutor) ReflectionUtil.getFieldValue(consumeMessageService.getClass(), + CONSUME_EXECUTOR_FIELD, consumeMessageService); if (Objects.nonNull(executor)) { String tpName = consumer.getConsumerGroup(); if (consumeMessageService instanceof ConsumeMessageConcurrentlyService) { @@ -96,14 +94,14 @@ public class RocketMqDtpAdapter extends AbstractDtpAdapter { } public void adaptProducerExecutors() { - val beans = JVMTI.getInstances(DefaultMQProducer.class); if (CollectionUtils.isEmpty(beans)) { log.warn("Cannot find beans of type DefaultMQProducer."); return; } for (DefaultMQProducer defaultMQProducer : beans) { - if (Objects.isNull(ReflectionUtils.findMethod(DefaultMQProducerImpl.class, "getAsyncSenderExecutor"))) { + val method = ReflectionUtil.findMethod(DefaultMQProducerImpl.class, "getAsyncSenderExecutor"); + if (Objects.isNull(method)) { continue; } val producer = (DefaultMQProducerImpl) ReflectionUtil.getFieldValue(DefaultMQProducer.class, diff --git a/adapter/adapter-sofa/pom.xml b/adapter/adapter-sofa/pom.xml index 6c6a62e3d9282c3f0e6bd88e382fd88f15f3c43b..51faab1ee3308c05febab5831fad0608e0247e06 100644 --- a/adapter/adapter-sofa/pom.xml +++ b/adapter/adapter-sofa/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-adapter-sofa diff --git a/adapter/adapter-tars/pom.xml b/adapter/adapter-tars/pom.xml index 37f11dd045040f62c7195eabb2aabda23ce129a5..6744317612f7ea0be567ee162f50d1a7f3119f9f 100644 --- a/adapter/adapter-tars/pom.xml +++ b/adapter/adapter-tars/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-adapter-tars diff --git a/adapter/adapter-thrift/pom.xml b/adapter/adapter-thrift/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..de95a4e64924f17c043526316a65abd2567b8baa --- /dev/null +++ b/adapter/adapter-thrift/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + org.dromara.dynamictp + dynamic-tp-adapter + 1.2.1 + ../pom.xml + + dynamic-tp-adapter-thrift + + + + org.dromara.dynamictp + dynamic-tp-adapter-common + + + + org.dromara.dynamictp + dynamic-tp-jvmti-runtime + + + + org.apache.thrift + libthrift + provided + + + diff --git a/adapter/adapter-thrift/src/main/java/org/dromara/dynamictp/adapter/thrift/ThriftDtpAdapter.java b/adapter/adapter-thrift/src/main/java/org/dromara/dynamictp/adapter/thrift/ThriftDtpAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..a2a801e540579963ce10b5d978c172c13cf788d3 --- /dev/null +++ b/adapter/adapter-thrift/src/main/java/org/dromara/dynamictp/adapter/thrift/ThriftDtpAdapter.java @@ -0,0 +1,158 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.adapter.thrift; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.thrift.server.THsHaServer; +import org.apache.thrift.server.TThreadPoolServer; +import org.apache.thrift.server.TThreadedSelectorServer; +import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; +import org.dromara.dynamictp.common.properties.DtpProperties; +import org.dromara.dynamictp.common.util.MethodUtil; +import org.dromara.dynamictp.common.util.ReflectionUtil; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; +import org.dromara.dynamictp.jvmti.JVMTI; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * ThriftDtpAdapter for managing Thrift server thread pools + * + * @author devin + * @since 1.2.2 + */ +@Slf4j +@SuppressWarnings("all") +public class ThriftDtpAdapter extends AbstractDtpAdapter { + + private static final String TP_PREFIX = "thriftTp"; + + private static final String THREAD_POOL_SERVER_EXECUTOR_FIELD = "executorService_"; + private static final String HSHASERVER_EXECUTOR_FIELD = "invoker"; + private static final String THREADED_SELECTOR_WORKER_FIELD = "invoker"; + + @Override + public void refresh(DtpProperties dtpProperties) { + refresh(dtpProperties.getThriftTp(), dtpProperties.getPlatforms()); + } + + @Override + protected String getTpPrefix() { + return TP_PREFIX; + } + + @Override + protected void initialize() { + super.initialize(); + List tThreadPoolServers = JVMTI.getInstances(TThreadPoolServer.class); + if (CollectionUtils.isEmpty(tThreadPoolServers)) { + if (log.isDebugEnabled()) { + log.debug("Cannot find instances of TThreadPoolServer."); + } + } + tThreadPoolServers.forEach(this::initializeTThreadPoolServer); + + List tHsHaServers = JVMTI.getInstances(THsHaServer.class); + if (CollectionUtils.isEmpty(tHsHaServers)) { + if (log.isDebugEnabled()) { + log.debug("Cannot find instances of THsHaServer."); + } + } + tHsHaServers.forEach(this::initializeTHsHaServer); + + List tThreadedSelectorServers = JVMTI.getInstances(TThreadedSelectorServer.class); + if (CollectionUtils.isEmpty(tThreadedSelectorServers)) { + if (log.isDebugEnabled()) { + log.debug("Cannot find instances of TThreadedSelectorServer."); + } + } + tThreadedSelectorServers.forEach(this::initializeTThreadedSelectorServer); + } + + public void initializeTThreadPoolServer(TThreadPoolServer server) { + ThreadPoolExecutor executor = (ThreadPoolExecutor) ReflectionUtil.getFieldValue( + TThreadPoolServer.class, THREAD_POOL_SERVER_EXECUTOR_FIELD, server); + if (Objects.nonNull(executor)) { + int port = getServerPort(server); + String tpName = genTpName("TThreadPoolServer", port); + ThreadPoolExecutorProxy proxy = new ThreadPoolExecutorProxy(executor); + enhanceOriginExecutor(tpName, proxy, THREAD_POOL_SERVER_EXECUTOR_FIELD, server); + } + } + + public void initializeTHsHaServer(THsHaServer server) { + ExecutorService executor = (ExecutorService) ReflectionUtil.getFieldValue( + THsHaServer.class, HSHASERVER_EXECUTOR_FIELD, server); + if (Objects.nonNull(executor) && executor instanceof ThreadPoolExecutor) { + int port = getServerPort(server); + String tpName = genTpName("THsHaServer", port); + ThreadPoolExecutorProxy proxy = new ThreadPoolExecutorProxy((ThreadPoolExecutor) executor); + enhanceOriginExecutor(tpName, proxy, HSHASERVER_EXECUTOR_FIELD, server); + } + } + + public void initializeTThreadedSelectorServer(TThreadedSelectorServer server) { + ExecutorService executor = (ExecutorService) ReflectionUtil.getFieldValue( + TThreadedSelectorServer.class, THREADED_SELECTOR_WORKER_FIELD, server); + if (Objects.nonNull(executor) && executor instanceof ThreadPoolExecutor) { + int port = getServerPort(server); + String tpName = genTpName("TThreadedSelectorServer", port); + ThreadPoolExecutorProxy proxy = new ThreadPoolExecutorProxy((ThreadPoolExecutor) executor); + enhanceOriginExecutor(tpName, proxy, THREADED_SELECTOR_WORKER_FIELD, server); + } + } + + private String genTpName(String serverType, int port) { + return TP_PREFIX + "#" + serverType + "#" + (port > 0 ? port : ""); + } + + /** + * Try to get the server port for better naming + * + * @param server Thrift server instance + * @return port number or -1 if not available + */ + private int getServerPort(Object server) { + try { + Object serverTransport = ReflectionUtil.getFieldValue("serverTransport_", server); + if (Objects.isNull(serverTransport)) { + return -1; + } + Object serverSocket = ReflectionUtil.getFieldValue("serverSocket_", serverTransport); + if (Objects.isNull(serverSocket)) { + return -1; + } + Method getLocalPortMethod = ReflectionUtil.findMethod(serverSocket.getClass(), "getLocalPort"); + if (getLocalPortMethod != null) { + int port = MethodUtil.invokeAndReturnInt(getLocalPortMethod, serverSocket); + if (port > 0) { + return port; + } + } + log.warn("Could not extract port from Thrift server: {}", server.getClass().getSimpleName()); + } catch (Exception e) { + log.warn("Error extracting port from Thrift server: {}", e.getMessage()); + } + return -1; + } +} diff --git a/adapter/pom.xml b/adapter/pom.xml index ca1eb4e36dd3979067c70190695b72eb069a0138..f16afd10a6899099e62de5800ade1a039bfc5f13 100644 --- a/adapter/pom.xml +++ b/adapter/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-all - ${revision} + 1.2.1 ../pom.xml dynamic-tp-adapter @@ -23,6 +23,8 @@ adapter-tars adapter-sofa adapter-rabbitmq + adapter-liteflow + adapter-thrift diff --git a/benchmark/pom.xml b/benchmark/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..e4e6595c364795a0659aadcc6f2073540325623d --- /dev/null +++ b/benchmark/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + org.dromara.dynamictp + dynamic-tp-all + 1.2.1 + ../pom.xml + + dynamic-tp-benchmark + + + + org.dromara.dynamictp + dynamic-tp-core + + + + org.dromara.dynamictp + dynamic-tp-extension-agent + + + + org.openjdk.jmh + jmh-core + + + org.openjdk.jmh + jmh-generator-annprocess + + + + diff --git a/benchmark/src/main/java/org/dromara/dynamictp/benchmark/BenchmarkRunner.java b/benchmark/src/main/java/org/dromara/dynamictp/benchmark/BenchmarkRunner.java new file mode 100644 index 0000000000000000000000000000000000000000..28ccafa33bcd71b108ae2e72c04beb706c748356 --- /dev/null +++ b/benchmark/src/main/java/org/dromara/dynamictp/benchmark/BenchmarkRunner.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.benchmark; + +import org.openjdk.jmh.results.format.ResultFormatType; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +/** + * BenchmarkRunner related + * + * @author yanhom + * @since 1.2.1 + **/ +public class BenchmarkRunner { + + public static void main(String[] args) throws RunnerException { + Options options = new OptionsBuilder() + .include(ExecutorBenchmark.class.getSimpleName()) + .resultFormat(ResultFormatType.JSON) + .result("executor-benchmark-results.json") + .build(); + + new Runner(options).run(); + } +} + diff --git a/benchmark/src/main/java/org/dromara/dynamictp/benchmark/ExecutorBenchmark.java b/benchmark/src/main/java/org/dromara/dynamictp/benchmark/ExecutorBenchmark.java new file mode 100644 index 0000000000000000000000000000000000000000..5445f3262346e07ed07d325d82def6b8c9e6a152 --- /dev/null +++ b/benchmark/src/main/java/org/dromara/dynamictp/benchmark/ExecutorBenchmark.java @@ -0,0 +1,186 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.benchmark; + +import com.google.common.collect.Sets; +import org.dromara.dynamictp.core.executor.DtpExecutor; +import org.dromara.dynamictp.core.support.ThreadPoolBuilder; +import org.dromara.dynamictp.core.support.task.wrapper.TaskWrappers; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Threads; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; + +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * ExecutorBenchmark related + * + * @author yanhom + * @since 1.2.1 + **/ +@BenchmarkMode(Mode.Throughput) +@OutputTimeUnit(TimeUnit.SECONDS) +@State(Scope.Thread) +@Warmup(iterations = 5) +public class ExecutorBenchmark { + + @Param({"100", "2000", "4000", "6000", "8000"}) + private int max; + + @Param({"MEDIUM"}) + private TaskType taskType; + + private ThreadPoolExecutor standardExecutor; + private DtpExecutor dtpExecutor; + + public enum TaskType { + // 轻量级任务,执行时间很短 + LIGHT, + // 中等任务,有一定计算量 + MEDIUM, + // 重量级任务,执行时间较长或有IO操作 + HEAVY + } + + @Setup + public void setup() { + standardExecutor = new ThreadPoolExecutor( + 4, + 8, + 60L, + TimeUnit.SECONDS, + new LinkedBlockingQueue<>(1024), + new ThreadFactory() { + private final AtomicInteger counter = new AtomicInteger(1); + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "standard-pool-" + counter.getAndIncrement()); + } + }, + new ThreadPoolExecutor.CallerRunsPolicy() + ); + + dtpExecutor = ThreadPoolBuilder.newBuilder() + .corePoolSize(4) + .maximumPoolSize(8) + .keepAliveTime(60) + .threadFactory("dtp-test-pool") + .runTimeout(100) + .queueTimeout(100) + .queueCapacity(1024) + .taskWrappers(TaskWrappers.getInstance().getByNames(Sets.newHashSet("ttl", "mdc"))) + .rejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()) + .buildDynamic(); + } + + @TearDown + public void tearDown() { + standardExecutor.shutdown(); + dtpExecutor.shutdown(); + try { + if (!standardExecutor.awaitTermination(5, TimeUnit.SECONDS)) { + standardExecutor.shutdownNow(); + } + if (!dtpExecutor.awaitTermination(5, TimeUnit.SECONDS)) { + dtpExecutor.shutdownNow(); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + @Benchmark + @Threads(1) + public void testStandardSubmit(Blackhole bh) { + executeTasksAndWait(standardExecutor, bh); + } + + @Benchmark + @Threads(1) + public void testDtpSubmit(Blackhole bh) { + executeTasksAndWait(dtpExecutor, bh); + } + + @Benchmark + @Threads(4) + public void test8ThreadsStandardSubmit(Blackhole bh) { + executeTasksAndWait(standardExecutor, bh); + } + + @Benchmark + @Threads(4) + public void test8ThreadsDtpSubmit(Blackhole bh) { + executeTasksAndWait(dtpExecutor, bh); + } + + private void executeTasksAndWait(ThreadPoolExecutor executor, Blackhole bh) { + executor.submit(() -> { + try { + int res = 0; + switch (taskType) { + case LIGHT: + res = max * max; + break; + case MEDIUM: + res = calculatePrimes(max); + break; + case HEAVY: + res = calculatePrimes(max); + Thread.sleep(2); + break; + default: + break; + } + bh.consume(res); + return res; + } catch (Exception e) { + return -1; + } + }); + } + + private int calculatePrimes(int max) { + int count = 0; + for (int i = 2; i <= max; i++) { + boolean isPrime = true; + for (int j = 2; j <= Math.sqrt(i); j++) { + if (i % j == 0) { + isPrime = false; + break; + } + } + if (isPrime) { + count++; + } + } + return count; + } +} diff --git a/benchmark/src/main/resources/executor-benchmark-results.json b/benchmark/src/main/resources/executor-benchmark-results.json new file mode 100644 index 0000000000000000000000000000000000000000..65ad47c4126f7d313a63720881a7d5acd6b7ce66 --- /dev/null +++ b/benchmark/src/main/resources/executor-benchmark-results.json @@ -0,0 +1,864 @@ +[ + { + "jmhVersion" : "1.36", + "benchmark" : "org.dromara.dynamictp.benchmark.ExecutorBenchmark.testDtpSubmit", + "mode" : "thrpt", + "threads" : 1, + "forks" : 5, + "jvm" : "D:\\java8\\java-se-8u41-ri\\jre\\bin\\java.exe", + "jvmArgs" : [ + "-Dvisualvm.id=2278179260565700", + "-javaagent:D:\\IntelliJ IDEA 2024.1.4\\lib\\idea_rt.jar=1579:D:\\IntelliJ IDEA 2024.1.4\\bin", + "-Dfile.encoding=UTF-8" + ], + "jdkVersion" : "1.8.0_41", + "vmName" : "OpenJDK Client VM", + "vmVersion" : "25.40-b25", + "warmupIterations" : 5, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "params" : { + "max" : "100", + "taskType" : "MEDIUM" + }, + "primaryMetric" : { + "score" : 835879.4802796174, + "scoreError" : 19897.455636183637, + "scoreConfidence" : [ + 815982.0246434337, + 855776.935915801 + ], + "scorePercentiles" : { + "0.0" : 772808.9079652693, + "50.0" : 845641.620886573, + "90.0" : 857708.265505212, + "95.0" : 859526.055539222, + "99.0" : 859679.8298281895, + "99.9" : 859679.8298281895, + "99.99" : 859679.8298281895, + "99.999" : 859679.8298281895, + "99.9999" : 859679.8298281895, + "100.0" : 859679.8298281895 + }, + "scoreUnit" : "ops/s", + "rawData" : [ + [ + 837083.6811061229, + 836988.3955275505, + 807880.9110136031, + 772808.9079652693, + 773014.3159528865 + ], + [ + 794317.0851141195, + 847147.8725064938, + 856735.6099320437, + 845641.620886573, + 855316.7163251701 + ], + [ + 844726.5474328864, + 852709.3252940127, + 855230.0055931485, + 837438.7249005582, + 859167.2488649645 + ], + [ + 852366.293103543, + 859679.8298281895, + 834931.1398763611, + 851008.8835481262, + 848208.331094282 + ], + [ + 844581.5439933728, + 839751.308302802, + 853500.3644639668, + 849520.1555104096, + 787232.1888539805 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.36", + "benchmark" : "org.dromara.dynamictp.benchmark.ExecutorBenchmark.testDtpSubmit", + "mode" : "thrpt", + "threads" : 1, + "forks" : 5, + "jvm" : "D:\\java8\\java-se-8u41-ri\\jre\\bin\\java.exe", + "jvmArgs" : [ + "-Dvisualvm.id=2278179260565700", + "-javaagent:D:\\IntelliJ IDEA 2024.1.4\\lib\\idea_rt.jar=1579:D:\\IntelliJ IDEA 2024.1.4\\bin", + "-Dfile.encoding=UTF-8" + ], + "jdkVersion" : "1.8.0_41", + "vmName" : "OpenJDK Client VM", + "vmVersion" : "25.40-b25", + "warmupIterations" : 5, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "params" : { + "max" : "2000", + "taskType" : "MEDIUM" + }, + "primaryMetric" : { + "score" : 96505.45836229522, + "scoreError" : 1076.1715196902455, + "scoreConfidence" : [ + 95429.28684260497, + 97581.62988198547 + ], + "scorePercentiles" : { + "0.0" : 93670.57370562815, + "50.0" : 96594.59497566153, + "90.0" : 98126.05019405008, + "95.0" : 98144.98322822564, + "99.0" : 98145.49775872249, + "99.9" : 98145.49775872249, + "99.99" : 98145.49775872249, + "99.999" : 98145.49775872249, + "99.9999" : 98145.49775872249, + "100.0" : 98145.49775872249 + }, + "scoreUnit" : "ops/s", + "rawData" : [ + [ + 96027.6890203491, + 95579.09907433369, + 96573.59109296952, + 94768.51352262578, + 98143.78265706633 + ], + [ + 97444.16733327185, + 95018.93368270407, + 94408.58197815283, + 97569.1531838222, + 97388.60317209976 + ], + [ + 98015.08841042618, + 97326.94670397948, + 98145.49775872249, + 98108.83556957358, + 96343.26156327194 + ], + [ + 96594.59497566153, + 96886.40956516683, + 98015.47935740056, + 96182.56319019997, + 93888.605026665 + ], + [ + 94513.96854793667, + 93670.57370562815, + 96352.12523005734, + 97556.16618325676, + 98114.22855203926 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.36", + "benchmark" : "org.dromara.dynamictp.benchmark.ExecutorBenchmark.testDtpSubmit", + "mode" : "thrpt", + "threads" : 1, + "forks" : 5, + "jvm" : "D:\\java8\\java-se-8u41-ri\\jre\\bin\\java.exe", + "jvmArgs" : [ + "-Dvisualvm.id=2278179260565700", + "-javaagent:D:\\IntelliJ IDEA 2024.1.4\\lib\\idea_rt.jar=1579:D:\\IntelliJ IDEA 2024.1.4\\bin", + "-Dfile.encoding=UTF-8" + ], + "jdkVersion" : "1.8.0_41", + "vmName" : "OpenJDK Client VM", + "vmVersion" : "25.40-b25", + "warmupIterations" : 5, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "params" : { + "max" : "4000", + "taskType" : "MEDIUM" + }, + "primaryMetric" : { + "score" : 40681.04605703, + "scoreError" : 334.638562946629, + "scoreConfidence" : [ + 40346.40749408337, + 41015.68461997663 + ], + "scorePercentiles" : { + "0.0" : 39276.96271051711, + "50.0" : 40772.080025229414, + "90.0" : 41174.442462232786, + "95.0" : 41201.323486827634, + "99.0" : 41207.32032574715, + "99.9" : 41207.32032574715, + "99.99" : 41207.32032574715, + "99.999" : 41207.32032574715, + "99.9999" : 41207.32032574715, + "100.0" : 41207.32032574715 + }, + "scoreUnit" : "ops/s", + "rawData" : [ + [ + 41187.330862682094, + 40860.97643228561, + 40667.33369922854, + 39875.63960208979, + 40808.3165950709 + ], + [ + 40555.39904133374, + 40718.209253956, + 40934.940110677926, + 40908.485605861955, + 40853.60377713414 + ], + [ + 39276.96271051711, + 40618.57635842393, + 40772.080025229414, + 40230.32167932655, + 40933.15804032801 + ], + [ + 41207.32032574715, + 41165.850195266576, + 40675.42629983596, + 40556.700773688746, + 41091.8078583088 + ], + [ + 39919.82883357655, + 40591.35818943041, + 40978.874306332094, + 40896.45457092153, + 40741.19627849657 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.36", + "benchmark" : "org.dromara.dynamictp.benchmark.ExecutorBenchmark.testDtpSubmit", + "mode" : "thrpt", + "threads" : 1, + "forks" : 5, + "jvm" : "D:\\java8\\java-se-8u41-ri\\jre\\bin\\java.exe", + "jvmArgs" : [ + "-Dvisualvm.id=2278179260565700", + "-javaagent:D:\\IntelliJ IDEA 2024.1.4\\lib\\idea_rt.jar=1579:D:\\IntelliJ IDEA 2024.1.4\\bin", + "-Dfile.encoding=UTF-8" + ], + "jdkVersion" : "1.8.0_41", + "vmName" : "OpenJDK Client VM", + "vmVersion" : "25.40-b25", + "warmupIterations" : 5, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "params" : { + "max" : "6000", + "taskType" : "MEDIUM" + }, + "primaryMetric" : { + "score" : 24098.037020718442, + "scoreError" : 118.92621134496876, + "scoreConfidence" : [ + 23979.110809373473, + 24216.963232063412 + ], + "scorePercentiles" : { + "0.0" : 23768.645427787593, + "50.0" : 24162.502073138323, + "90.0" : 24260.203643349883, + "95.0" : 24284.61911787857, + "99.0" : 24289.265832308476, + "99.9" : 24289.265832308476, + "99.99" : 24289.265832308476, + "99.999" : 24289.265832308476, + "99.9999" : 24289.265832308476, + "100.0" : 24289.265832308476 + }, + "scoreUnit" : "ops/s", + "rawData" : [ + [ + 23982.931542750703, + 23964.214090032005, + 24046.02936605224, + 23862.261403498338, + 24225.915240963932 + ], + [ + 24251.15488277728, + 24273.77678420879, + 24011.0983726943, + 23979.923026919078, + 24238.814307597437 + ], + [ + 23768.645427787593, + 23908.81157813695, + 24162.502073138323, + 24241.980150274732, + 23780.724249675368 + ], + [ + 24077.68490480317, + 24197.53646088712, + 24198.291479172258, + 24037.338425911614, + 24239.094669814083 + ], + [ + 24289.265832308476, + 24240.561271730046, + 24242.273855321302, + 24190.53056999225, + 24039.565551513704 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.36", + "benchmark" : "org.dromara.dynamictp.benchmark.ExecutorBenchmark.testDtpSubmit", + "mode" : "thrpt", + "threads" : 1, + "forks" : 5, + "jvm" : "D:\\java8\\java-se-8u41-ri\\jre\\bin\\java.exe", + "jvmArgs" : [ + "-Dvisualvm.id=2278179260565700", + "-javaagent:D:\\IntelliJ IDEA 2024.1.4\\lib\\idea_rt.jar=1579:D:\\IntelliJ IDEA 2024.1.4\\bin", + "-Dfile.encoding=UTF-8" + ], + "jdkVersion" : "1.8.0_41", + "vmName" : "OpenJDK Client VM", + "vmVersion" : "25.40-b25", + "warmupIterations" : 5, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "params" : { + "max" : "8000", + "taskType" : "MEDIUM" + }, + "primaryMetric" : { + "score" : 16477.238900139142, + "scoreError" : 228.68439546131336, + "scoreConfidence" : [ + 16248.554504677828, + 16705.923295600456 + ], + "scorePercentiles" : { + "0.0" : 15944.430607470855, + "50.0" : 16623.543545732417, + "90.0" : 16800.747617198922, + "95.0" : 16817.511764616032, + "99.0" : 16823.200549239868, + "99.9" : 16823.200549239868, + "99.99" : 16823.200549239868, + "99.999" : 16823.200549239868, + "99.9999" : 16823.200549239868, + "100.0" : 16823.200549239868 + }, + "scoreUnit" : "ops/s", + "rawData" : [ + [ + 15944.430607470855, + 16365.390325495637, + 15995.946673493052, + 16125.000291194025, + 16085.662268303851 + ], + [ + 16237.842213643718, + 16159.301446084488, + 16027.209336392842, + 16137.655546608883, + 16201.613200427111 + ], + [ + 16726.25151397067, + 16697.713026471527, + 16692.67424902825, + 16753.865768471336, + 16753.585262747412 + ], + [ + 16732.229353251434, + 16623.543545732417, + 16669.4156825611, + 16823.200549239868, + 16654.425769884347 + ], + [ + 16608.23811558137, + 16804.237933827088, + 16798.420739446814, + 16616.325815098866, + 16696.79326905147 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.36", + "benchmark" : "org.dromara.dynamictp.benchmark.ExecutorBenchmark.testStandardSubmit", + "mode" : "thrpt", + "threads" : 1, + "forks" : 5, + "jvm" : "D:\\java8\\java-se-8u41-ri\\jre\\bin\\java.exe", + "jvmArgs" : [ + "-Dvisualvm.id=2278179260565700", + "-javaagent:D:\\IntelliJ IDEA 2024.1.4\\lib\\idea_rt.jar=1579:D:\\IntelliJ IDEA 2024.1.4\\bin", + "-Dfile.encoding=UTF-8" + ], + "jdkVersion" : "1.8.0_41", + "vmName" : "OpenJDK Client VM", + "vmVersion" : "25.40-b25", + "warmupIterations" : 5, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "params" : { + "max" : "100", + "taskType" : "MEDIUM" + }, + "primaryMetric" : { + "score" : 2024530.591058425, + "scoreError" : 24116.539601117427, + "scoreConfidence" : [ + 2000414.0514573075, + 2048647.1306595423 + ], + "scorePercentiles" : { + "0.0" : 1982516.6755444333, + "50.0" : 2019873.2512882825, + "90.0" : 2073343.650756332, + "95.0" : 2102288.4293866465, + "99.0" : 2107612.321198558, + "99.9" : 2107612.321198558, + "99.99" : 2107612.321198558, + "99.999" : 2107612.321198558, + "99.9999" : 2107612.321198558, + "100.0" : 2107612.321198558 + }, + "scoreUnit" : "ops/s", + "rawData" : [ + [ + 1992469.2641976194, + 1994759.5835302651, + 2011924.9783304564, + 2022600.7949903489, + 2034566.4773653138 + ], + [ + 2044482.091184728, + 1999814.7261992493, + 2036399.8525117594, + 2043947.1034784091, + 2042859.7714767663 + ], + [ + 2019873.2512882825, + 1995127.8284573886, + 2007616.9358470612, + 1998245.334024759, + 2022065.7694299472 + ], + [ + 1985354.5861612302, + 2003272.5274571844, + 2001251.028938096, + 1982516.6755444333, + 2006358.7174283578 + ], + [ + 2051892.4148911396, + 2056057.9862157607, + 2062328.741154651, + 2107612.321198558, + 2089866.0151588537 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.36", + "benchmark" : "org.dromara.dynamictp.benchmark.ExecutorBenchmark.testStandardSubmit", + "mode" : "thrpt", + "threads" : 1, + "forks" : 5, + "jvm" : "D:\\java8\\java-se-8u41-ri\\jre\\bin\\java.exe", + "jvmArgs" : [ + "-Dvisualvm.id=2278179260565700", + "-javaagent:D:\\IntelliJ IDEA 2024.1.4\\lib\\idea_rt.jar=1579:D:\\IntelliJ IDEA 2024.1.4\\bin", + "-Dfile.encoding=UTF-8" + ], + "jdkVersion" : "1.8.0_41", + "vmName" : "OpenJDK Client VM", + "vmVersion" : "25.40-b25", + "warmupIterations" : 5, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "params" : { + "max" : "2000", + "taskType" : "MEDIUM" + }, + "primaryMetric" : { + "score" : 102962.75035792969, + "scoreError" : 601.2503379251723, + "scoreConfidence" : [ + 102361.50002000452, + 103564.00069585486 + ], + "scorePercentiles" : { + "0.0" : 100589.79715474774, + "50.0" : 103272.58799110886, + "90.0" : 103760.72904311687, + "95.0" : 104026.68645549331, + "99.0" : 104116.32078278087, + "99.9" : 104116.32078278087, + "99.99" : 104116.32078278087, + "99.999" : 104116.32078278087, + "99.9999" : 104116.32078278087, + "100.0" : 104116.32078278087 + }, + "scoreUnit" : "ops/s", + "rawData" : [ + [ + 103565.00420332824, + 100589.79715474774, + 103513.78331164381, + 102591.49593303356, + 102792.21443713512 + ], + [ + 102325.23866182845, + 103036.85359553211, + 103107.43472473524, + 102297.0846683748, + 103326.91044250756 + ], + [ + 103722.85527731321, + 103404.01001235774, + 102850.59778174109, + 103274.68179542778, + 103817.53969182234 + ], + [ + 103539.36486741598, + 102399.53443744319, + 103444.26386253507, + 102359.31889384275, + 103479.16262033381 + ], + [ + 103673.97377694117, + 103272.58799110886, + 104116.32078278087, + 101506.74445528393, + 102061.98556902874 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.36", + "benchmark" : "org.dromara.dynamictp.benchmark.ExecutorBenchmark.testStandardSubmit", + "mode" : "thrpt", + "threads" : 1, + "forks" : 5, + "jvm" : "D:\\java8\\java-se-8u41-ri\\jre\\bin\\java.exe", + "jvmArgs" : [ + "-Dvisualvm.id=2278179260565700", + "-javaagent:D:\\IntelliJ IDEA 2024.1.4\\lib\\idea_rt.jar=1579:D:\\IntelliJ IDEA 2024.1.4\\bin", + "-Dfile.encoding=UTF-8" + ], + "jdkVersion" : "1.8.0_41", + "vmName" : "OpenJDK Client VM", + "vmVersion" : "25.40-b25", + "warmupIterations" : 5, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "params" : { + "max" : "4000", + "taskType" : "MEDIUM" + }, + "primaryMetric" : { + "score" : 41844.18636584237, + "scoreError" : 246.58991369253627, + "scoreConfidence" : [ + 41597.59645214983, + 42090.776279534904 + ], + "scorePercentiles" : { + "0.0" : 40986.73341838288, + "50.0" : 41882.63870064468, + "90.0" : 42199.94798983034, + "95.0" : 42286.64508487596, + "99.0" : 42309.044955223, + "99.9" : 42309.044955223, + "99.99" : 42309.044955223, + "99.999" : 42309.044955223, + "99.9999" : 42309.044955223, + "100.0" : 42309.044955223 + }, + "scoreUnit" : "ops/s", + "rawData" : [ + [ + 41882.63870064468, + 41744.61375638908, + 41819.820948860266, + 41617.721087440965, + 42309.044955223 + ], + [ + 42045.37019115379, + 41841.68396943274, + 41631.01730800342, + 41704.7497841965, + 42073.91990425318 + ], + [ + 41967.60012674226, + 41631.146893697514, + 42080.06203574377, + 42091.88002827002, + 41541.123482294526 + ], + [ + 41691.11989967058, + 42133.35812889493, + 42171.70694198779, + 41330.2986335887, + 40986.73341838288 + ], + [ + 41958.7257579559, + 42234.37872073287, + 41287.63688403775, + 42176.99416922865, + 42151.31341923346 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.36", + "benchmark" : "org.dromara.dynamictp.benchmark.ExecutorBenchmark.testStandardSubmit", + "mode" : "thrpt", + "threads" : 1, + "forks" : 5, + "jvm" : "D:\\java8\\java-se-8u41-ri\\jre\\bin\\java.exe", + "jvmArgs" : [ + "-Dvisualvm.id=2278179260565700", + "-javaagent:D:\\IntelliJ IDEA 2024.1.4\\lib\\idea_rt.jar=1579:D:\\IntelliJ IDEA 2024.1.4\\bin", + "-Dfile.encoding=UTF-8" + ], + "jdkVersion" : "1.8.0_41", + "vmName" : "OpenJDK Client VM", + "vmVersion" : "25.40-b25", + "warmupIterations" : 5, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "params" : { + "max" : "6000", + "taskType" : "MEDIUM" + }, + "primaryMetric" : { + "score" : 24421.991900186054, + "scoreError" : 353.59787358267147, + "scoreConfidence" : [ + 23768.394026603382, + 24475.589773768726 + ], + "scorePercentiles" : { + "0.0" : 23071.77658872453, + "50.0" : 24234.665571961857, + "90.0" : 24638.749496464687, + "95.0" : 24658.36278645418, + "99.0" : 24666.34820228978, + "99.9" : 24666.34820228978, + "99.99" : 24666.34820228978, + "99.999" : 24666.34820228978, + "99.9999" : 24666.34820228978, + "100.0" : 24666.34820228978 + }, + "scoreUnit" : "ops/s", + "rawData" : [ + [ + 24629.174542583765, + 24234.665571961857, + 24639.730149504445, + 24666.34820228978, + 24013.148353807024 + ], + [ + 24218.87198660302, + 24563.91735119501, + 24553.246124015022, + 24372.07927855178, + 24538.369977505812 + ], + [ + 24370.033612120453, + 24622.083011965075, + 24240.48544207802, + 24545.860456254624, + 24638.095727771517 + ], + [ + 23754.67404893567, + 23739.607210700233, + 23661.39556451895, + 23639.18446206984, + 23771.06266492151 + ], + [ + 23498.967402402424, + 23071.77658872453, + 23338.742807054266, + 23773.96102058579, + 23954.31594653106 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.36", + "benchmark" : "org.dromara.dynamictp.benchmark.ExecutorBenchmark.testStandardSubmit", + "mode" : "thrpt", + "threads" : 1, + "forks" : 5, + "jvm" : "D:\\java8\\java-se-8u41-ri\\jre\\bin\\java.exe", + "jvmArgs" : [ + "-Dvisualvm.id=2278179260565700", + "-javaagent:D:\\IntelliJ IDEA 2024.1.4\\lib\\idea_rt.jar=1579:D:\\IntelliJ IDEA 2024.1.4\\bin", + "-Dfile.encoding=UTF-8" + ], + "jdkVersion" : "1.8.0_41", + "vmName" : "OpenJDK Client VM", + "vmVersion" : "25.40-b25", + "warmupIterations" : 5, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "params" : { + "max" : "8000", + "taskType" : "MEDIUM" + }, + "primaryMetric" : { + "score" : 16521.767304907597, + "scoreError" : 88.15687309478982, + "scoreConfidence" : [ + 16433.610431812805, + 16609.924178002388 + ], + "scorePercentiles" : { + "0.0" : 16264.927174329181, + "50.0" : 16561.192321076844, + "90.0" : 16636.84276023751, + "95.0" : 16651.2448011043, + "99.0" : 16653.865846519366, + "99.9" : 16653.865846519366, + "99.99" : 16653.865846519366, + "99.999" : 16653.865846519366, + "99.9999" : 16653.865846519366, + "100.0" : 16653.865846519366 + }, + "scoreUnit" : "ops/s", + "rawData" : [ + [ + 16381.942803082016, + 16631.31858141641, + 16482.953413865394, + 16620.31962609732, + 16303.565192651096 + ], + [ + 16557.98284385913, + 16602.776951628442, + 16605.998364679246, + 16617.067982421475, + 16466.922440418817 + ], + [ + 16355.04925035902, + 16645.129028469153, + 16604.224709508504, + 16590.82646841938, + 16386.74464754489 + ], + [ + 16448.99691399792, + 16653.865846519366, + 16491.486174841586, + 16627.643715889506, + 16371.267809008117 + ], + [ + 16264.927174329181, + 16561.192321076844, + 16547.20889601228, + 16608.180035706322, + 16616.59143088852 + ] + ] + }, + "secondaryMetrics" : { + } + } +] + + diff --git a/common/pom.xml b/common/pom.xml index d3b3951b977a1c738b8a809fdc3602fe9e2d5544..c0268978b3264972eb6b5d4c6f3b30527d21c77f 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -5,17 +5,12 @@ org.dromara.dynamictp dynamic-tp-all - ${revision} + 1.2.1 ../pom.xml dynamic-tp-common - - org.springframework - spring-context - - org.slf4j slf4j-api @@ -57,8 +52,13 @@ - cglib - cglib + net.bytebuddy + byte-buddy + + + + org.yaml + snakeyaml diff --git a/common/src/main/java/org/dromara/dynamictp/common/constant/DingNotifyConst.java b/common/src/main/java/org/dromara/dynamictp/common/constant/DingNotifyConst.java index a0df744fee72fcd648ea4224f5e4e61e96ae1aa1..aad7bf779e28992616d8518fd3f1d0101e74e47c 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/constant/DingNotifyConst.java +++ b/common/src/main/java/org/dromara/dynamictp/common/constant/DingNotifyConst.java @@ -68,8 +68,9 @@ public final class DingNotifyConst { "上次报警时间:%s \n\n" + "报警时间:%s \n\n" + "接收人:@%s \n\n" + + "统计窗口:%ss \n\n" + + "静默时长:%ss \n\n" + "trace 信息:%s \n\n" + - "报警间隔:%ss \n\n" + "扩展信息:%s \n\n"; public static final String DING_CHANGE_NOTICE_TEMPLATE = diff --git a/common/src/main/java/org/dromara/dynamictp/common/constant/DynamicTpConst.java b/common/src/main/java/org/dromara/dynamictp/common/constant/DynamicTpConst.java index d1cbcbf9fa18d063918e2ed0e752794bf9a1686e..aee9db61ec387e24d70e98bbc0358fcbdddd3627 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/constant/DynamicTpConst.java +++ b/common/src/main/java/org/dromara/dynamictp/common/constant/DynamicTpConst.java @@ -17,11 +17,6 @@ package org.dromara.dynamictp.common.constant; -import com.google.common.collect.ImmutableList; -import org.dromara.dynamictp.common.em.NotifyItemEnum; - -import java.util.List; - /** * DynamicTpConst related * @@ -32,7 +27,7 @@ public final class DynamicTpConst { private DynamicTpConst() { } - public static final String MAIN_PROPERTIES_PREFIX = "spring.dynamic.tp"; + public static final String MAIN_PROPERTIES_PREFIX = "dynamictp"; public static final String DTP_ENABLED_PROP = MAIN_PROPERTIES_PREFIX + ".enabled"; @@ -44,10 +39,18 @@ public final class DynamicTpConst { public static final String UNKNOWN = "---"; - public static final String VALUE = "value"; - public static final String TRACE_ID = "traceId"; + public static final String GLOBAL_CONFIG_PREFIX = MAIN_PROPERTIES_PREFIX + ".globalExecutorProps."; + + public static final String EXECUTORS_CONFIG_PREFIX = MAIN_PROPERTIES_PREFIX + ".executors["; + + public static final String APP_NAME_KEY = "APP.NAME"; + + public static final String APP_PORT_KEY = "APP.PORT"; + + public static final String APP_ENV_KEY = "APP.ENV"; + /** * Dtp executor properties const. */ @@ -73,11 +76,11 @@ public final class DynamicTpConst { public static final String REJECT_HANDLER_TYPE = "rejectHandlerType"; - public static final String RUN_TIMEOUT = "runTimeout"; + public static final String RUN_TIMEOUT_PROP = "runTimeout"; public static final String TRY_INTERRUPT_WHEN_TIMEOUT = "tryInterrupt"; - public static final String QUEUE_TIMEOUT = "queueTimeout"; + public static final String QUEUE_TIMEOUT_PROP = "queueTimeout"; public static final String TASK_WRAPPERS = "taskWrappers"; @@ -94,8 +97,34 @@ public final class DynamicTpConst { public static final String ARR_RIGHT_BRACKET = "]"; - public static final List SCHEDULE_NOTIFY_ITEMS = ImmutableList.of(NotifyItemEnum.LIVENESS, - NotifyItemEnum.CAPACITY); +// public static final List SCHEDULE_NOTIFY_ITEMS = ImmutableList.of(NotifyItemEnum.LIVENESS, +// NotifyItemEnum.CAPACITY); + + /** + * Config change notify. + */ + public static final String CHANGE = "change"; + /** + * ThreadPool liveness notify. + * liveness = activeCount / maximumPoolSize + */ + public static final String LIVENESS = "liveness"; + /** + * Capacity threshold notify. + */ + public static final String CAPACITY = "capacity"; + /** + * Reject notify. + */ + public static final String REJECT = "reject"; + /** + * Task run timeout alarm. + */ + public static final String RUN_TIMEOUT = "run_timeout"; + /** + * Task queue wait timeout alarm. + */ + public static final String QUEUE_TIMEOUT = "queue_timeout"; /** * unit diff --git a/common/src/main/java/org/dromara/dynamictp/common/constant/LarkNotifyConst.java b/common/src/main/java/org/dromara/dynamictp/common/constant/LarkNotifyConst.java index 9145dac1e09d94b83fe2cc9d5b4c7517bd6d1753..ae96ce1bf55c8e6110842b2af37373fa0cf6d621 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/constant/LarkNotifyConst.java +++ b/common/src/main/java/org/dromara/dynamictp/common/constant/LarkNotifyConst.java @@ -43,7 +43,7 @@ public class LarkNotifyConst { * lark at format. username * 当配置username时,只能蓝色字体展示@username,被@人无@提醒 */ - public static final String LARK_AT_FORMAT_USERNAME = "%s"; + public static final String LARK_AT_FORMAT_USERNAME = "%s"; /** * lark openid prefix @@ -64,12 +64,12 @@ public class LarkNotifyConst { * lark alarm json str */ public static final String LARK_ALARM_JSON_STR = - "{\"msg_type\":\"interactive\",\"card\":{\"config\":{\"wide_screen_mode\":true},\"header\":{\"template\":\"red\",\"title\":{\"tag\":\"plain_text\",\"content\":\"【报警】 动态线程池告警\"}},\"elements\":[{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**服务名称:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**实例信息:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**环境:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**线程池名称:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"alarmType **报警项:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"alarmValue **报警阈值 / 当前值:**\\n%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"corePoolSize **核心线程数:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"maximumPoolSize **最大线程数:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"poolSize **当前线程数:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"activeCount **活跃线程数:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**历史最大线程数:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**任务总数:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**执行完成任务数:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**等待执行任务数:**\\n%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueType **队列类型:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueCapacity **队列容量:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueSize **队列任务数量:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueRemaining **队列剩余容量:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"rejectType **拒绝策略:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"rejectCount **总拒绝任务数量:**\\n%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"runTimeoutCount **总执行超时任务数量:**\\n%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueTimeoutCount **总等待超时任务数量:**\\n%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**上次报警时间:**\\n %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**报警时间:**\\n %s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**接收人:**\\n %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**trace 信息:**\\n %s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**报警间隔:**\\n %ss\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**扩展信息:**\\n %s\"}}]}]}}"; + "{\"msg_type\":\"interactive\",\"card\":{\"config\":{\"wide_screen_mode\":true},\"header\":{\"template\":\"red\",\"title\":{\"tag\":\"plain_text\",\"content\":\"【报警】 动态线程池告警\"}},\"elements\":[{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**服务名称:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**实例信息:**%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**环境:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**线程池名称:**%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"alarmType **报警项:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"alarmValue **报警阈值 / 当前值:**%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"corePoolSize **核心线程数:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"maximumPoolSize **最大线程数:**%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"poolSize **当前线程数:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"activeCount **活跃线程数:**%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**历史最大线程数:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**任务总数:**%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**执行完成任务数:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**等待执行任务数:**%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueType **队列类型:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueCapacity **队列容量:**%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueSize **队列任务数量:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueRemaining **队列剩余容量:**%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"rejectType **拒绝策略:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"rejectCount **总拒绝任务数量:**%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"runTimeoutCount **总执行超时任务数量:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueTimeoutCount **总等待超时任务数量:**%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**上次报警时间:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**报警时间:**%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**接收人:**%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**统计窗口:**%ss\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**静默时长:**%ss\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**trace 信息:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**扩展信息:**%s\"}}]}]}}"; /** * lark notice json str */ public static final String LARK_CHANGE_NOTICE_JSON_STR = - "{\"msg_type\":\"interactive\",\"card\":{\"config\":{\"wide_screen_mode\":true},\"header\":{\"template\":\"green\",\"title\":{\"tag\":\"plain_text\",\"content\":\"【通知】动态线程池参数变更\"}},\"elements\":[{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**服务名称: ** \\n %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**实例信息:**\\n %s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**环境:**\\n %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**线程池名称:**\\n %s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"corePoolSize **核心线程数:**\\n %s => %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"maxPoolSize **最大线程数:**\\n %s => %s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"allowCoreThreadTimeOut **允许核心线程超时:**\\n %s => %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"keepAliveTime **线程存活时间:**\\n %s => %s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**队列类型:**\\n %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueCapacity **队列容量:**\\n %s => %s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"rejectType **拒绝策略:**\\n %s => %s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**接收人:**\\n %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**通知时间:**\\n %s\"}}]}]}}"; + "{\"msg_type\":\"interactive\",\"card\":{\"config\":{\"wide_screen_mode\":true},\"header\":{\"template\":\"green\",\"title\":{\"tag\":\"plain_text\",\"content\":\"【通知】动态线程池参数变更\"}},\"elements\":[{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**服务名称: **%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**实例信息:**%s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**环境:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**线程池名称:**%s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"corePoolSize **核心线程数:**%s => %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"maxPoolSize **最大线程数:**%s => %s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"allowCoreThreadTimeOut **允许核心线程超时:**%s => %s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"keepAliveTime **线程存活时间:**%s => %s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**队列类型:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"queueCapacity **队列容量:**%s => %s\"}}]},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"rejectType **拒绝策略:**%s => %s\"}}]},{\"tag\":\"hr\"},{\"tag\":\"div\",\"fields\":[{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**接收人:**%s\"}},{\"is_short\":true,\"text\":{\"tag\":\"lark_md\",\"content\":\"**通知时间:**%s\"}}]}]}}"; } diff --git a/common/src/main/java/org/dromara/dynamictp/common/constant/WechatNotifyConst.java b/common/src/main/java/org/dromara/dynamictp/common/constant/WechatNotifyConst.java index d5ca983a3808780f6f180eaa90791bf0c33e1e76..a5ff0e794f2da102fab403aa9b8eb7bf66ae9c1c 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/constant/WechatNotifyConst.java +++ b/common/src/main/java/org/dromara/dynamictp/common/constant/WechatNotifyConst.java @@ -67,8 +67,9 @@ public final class WechatNotifyConst { "> 上次报警时间:%s \n" + "> 报警时间:%s \n" + "> 接收人:%s \n" + + "> 统计窗口:%ss \n" + + "> 静默时长:%ss \n" + "> trace 信息:%s \n" + - "> 报警间隔:%ss \n" + "> 扩展信息:%s \n"; public static final String WECHAT_CHANGE_NOTICE_TEMPLATE = diff --git a/common/src/main/java/org/dromara/dynamictp/common/em/JreEnum.java b/common/src/main/java/org/dromara/dynamictp/common/em/JreEnum.java index fc4863e4235b46ea3d527bf2d2f8990836e1de36..455e67d1ef29fd4f75945f3586e0fd1288f942b1 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/em/JreEnum.java +++ b/common/src/main/java/org/dromara/dynamictp/common/em/JreEnum.java @@ -23,6 +23,7 @@ import org.apache.commons.lang3.reflect.MethodUtils; /** * JRE version + * * @author kamtohung */ @Slf4j @@ -53,7 +54,15 @@ public enum JreEnum { JAVA_18, - JAVA_19; + JAVA_19, + + JAVA_20, + + JAVA_21, + + JAVA_22, + + JAVA_23; private static final JreEnum VERSION = getJre(); @@ -92,9 +101,29 @@ public enum JreEnum { int majorVersion = (int) MethodUtils.invokeMethod(javaRunTimeVersion, "major"); return JreEnum.valueOf("JAVA_" + majorVersion); } catch (Exception e) { - log.debug("can't determine current JRE version", e); + log.warn("can't determine current JRE version", e); } return JAVA_8; } + /** + * 判断当前版本是否大于某个版本 + * + * @param targetVersion 目标版本 + * @return 是否大于 + */ + public static boolean greaterThan(JreEnum targetVersion) { + return getJre().ordinal() > targetVersion.ordinal(); + } + + /** + * 判断当前版本是否小于某个版本 + * + * @param targetVersion 目标版本 + * @return 是否小于 + */ + public static boolean lessThan(JreEnum targetVersion) { + return getJre().ordinal() < targetVersion.ordinal(); + } + } diff --git a/common/src/main/java/org/dromara/dynamictp/common/em/NotifyItemEnum.java b/common/src/main/java/org/dromara/dynamictp/common/em/NotifyItemTypeGroupEnum.java similarity index 51% rename from common/src/main/java/org/dromara/dynamictp/common/em/NotifyItemEnum.java rename to common/src/main/java/org/dromara/dynamictp/common/em/NotifyItemTypeGroupEnum.java index 10329bd151dbe50f57560e177b2b6b730466394a..65641f0bbd4f687b636f99bda3d47c509ee3f969 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/em/NotifyItemEnum.java +++ b/common/src/main/java/org/dromara/dynamictp/common/em/NotifyItemTypeGroupEnum.java @@ -14,63 +14,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.dromara.dynamictp.common.em; import lombok.AllArgsConstructor; import lombok.Getter; -/** - * NotifyItemEnum related - * - * @author yanhom - * @since 1.0.0 - **/ @Getter @AllArgsConstructor -public enum NotifyItemEnum { - - /** - * Config change notify. - */ - CHANGE("change", ""), - - /** - * ThreadPool liveness notify. - * liveness = activeCount / maximumPoolSize - */ - LIVENESS("liveness", "%"), - - /** - * Capacity threshold notify - */ - CAPACITY("capacity", "%"), +public enum NotifyItemTypeGroupEnum { - /** - * Reject notify. - */ - REJECT("reject", ""), - - /** - * Task run timeout alarm. - */ - RUN_TIMEOUT("run_timeout", ""), - - /** - * Task queue wait timeout alarm. - */ - QUEUE_TIMEOUT("queue_timeout", ""); + SCHEDULE("schedule"), + SIMPLE("simple"), + FRAMEWORK_WITHOUT_SIMPLE("frameworkWithoutSimple"), + CUSTOM("custom"); private final String value; - - private final String unit; - - public static NotifyItemEnum of(String value) { - for (NotifyItemEnum notifyItem : NotifyItemEnum.values()) { - if (notifyItem.value.equals(value)) { - return notifyItem; - } - } - return null; - } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/entity/AlarmInfo.java b/common/src/main/java/org/dromara/dynamictp/common/entity/AlarmInfo.java index 55844c3a41af1a498c6595a630bcfd52de58c855..f42e8a75ecc25beef8c4205e7a5642d8c73a39f5 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/entity/AlarmInfo.java +++ b/common/src/main/java/org/dromara/dynamictp/common/entity/AlarmInfo.java @@ -19,8 +19,7 @@ package org.dromara.dynamictp.common.entity; import lombok.Data; import lombok.experimental.Accessors; -import org.dromara.dynamictp.common.em.NotifyItemEnum; -import org.dromara.dynamictp.common.util.DateUtil; +import org.dromara.dynamictp.common.notifier.type.CommonNotifyItemType; import java.util.concurrent.atomic.AtomicInteger; @@ -34,9 +33,7 @@ import java.util.concurrent.atomic.AtomicInteger; @Accessors(chain = true) public class AlarmInfo { - private NotifyItemEnum notifyItem; - - private String lastAlarmTime; + private CommonNotifyItemType notifyItem; private final AtomicInteger counter = new AtomicInteger(0); @@ -45,7 +42,6 @@ public class AlarmInfo { } public void reset() { - lastAlarmTime = DateUtil.now(); counter.set(0); } diff --git a/common/src/main/java/org/dromara/dynamictp/common/entity/CustomNotifyParam.java b/common/src/main/java/org/dromara/dynamictp/common/entity/CustomNotifyParam.java new file mode 100644 index 0000000000000000000000000000000000000000..dacd8bec96bc6a8b870df4de86efe8225245098c --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/entity/CustomNotifyParam.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.dynamictp.common.entity; + +import cn.hutool.core.map.MapUtil; + +import java.util.HashMap; +import java.util.Map; + +public class CustomNotifyParam { + + private final Map customAlarmParams; + + public CustomNotifyParam() { + customAlarmParams = new HashMap<>(); + } + + public CustomNotifyParam(int size) { + this.customAlarmParams = MapUtil.newHashMap(size); + } + + public CustomNotifyParam put(String key, Object value) { + customAlarmParams.put(key, value); + return this; + } + + public T get(String key) { + return (T) customAlarmParams.get(key); + } + + public Map getCustomAlarmParams() { + return customAlarmParams; + } +} diff --git a/common/src/main/java/org/dromara/dynamictp/common/entity/DtpExecutorProps.java b/common/src/main/java/org/dromara/dynamictp/common/entity/DtpExecutorProps.java index 5215746bb342bc87b1031406f7b43a75ae23552a..a2e8f379c0bc8d5cbf8036d18857545ba08f3a6d 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/entity/DtpExecutorProps.java +++ b/common/src/main/java/org/dromara/dynamictp/common/entity/DtpExecutorProps.java @@ -21,7 +21,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; import org.dromara.dynamictp.common.em.QueueTypeEnum; -import org.dromara.dynamictp.common.em.RejectedTypeEnum; import java.util.Set; @@ -46,74 +45,23 @@ public class DtpExecutorProps extends TpExecutorProps { */ private String queueType = QueueTypeEnum.VARIABLE_LINKED_BLOCKING_QUEUE.getName(); - /** - * BlockingQueue capacity. - */ - private int queueCapacity = 1024; - /** * If fair strategy, for SynchronousQueue */ private boolean fair = false; - /** - * Max free memory for MemorySafeLBQ, unit M - */ - private int maxFreeMemory = 16; - - /** - * RejectedExecutionHandler type, see {@link RejectedTypeEnum} - */ - private String rejectedHandlerType = RejectedTypeEnum.ABORT_POLICY.getName(); - - /** - * If allow core thread timeout. - */ - private boolean allowCoreThreadTimeOut = false; - - /** - * Thread name prefix. - */ - private String threadNamePrefix = "dtp"; - - /** - * Whether to wait for scheduled tasks to complete on shutdown, - * not interrupting running tasks and executing all tasks in the queue. - */ - private boolean waitForTasksToCompleteOnShutdown = true; - - /** - * The maximum number of seconds that this executor is supposed to block - * on shutdown in order to wait for remaining tasks to complete their execution - * before the rest of the container continues to shut down. - */ - private int awaitTerminationSeconds = 3; - /** * If pre start all core threads. */ private boolean preStartAllCoreThreads = false; - /** - * If enhance reject. - */ - private boolean rejectEnhanced = true; - /** * Plugin names. */ private Set pluginNames; /** - * check core param is inValid - * - * @return boolean return true means params is inValid + * If false, will not auto create dtpExecutor, default is true. */ - public boolean coreParamIsInValid() { - return this.getCorePoolSize() < 0 - || this.getMaximumPoolSize() <= 0 - || this.getMaximumPoolSize() < this.getCorePoolSize() - || this.getKeepAliveTime() < 0; - } - + private boolean autoCreate = true; } diff --git a/common/src/main/java/org/dromara/dynamictp/common/entity/MarkdownReq.java b/common/src/main/java/org/dromara/dynamictp/common/entity/MarkdownReq.java index ef916fb68161e63da7a9dca751f8fd6190a7334d..69ae8e4710b90b21d648c86d2e07560578f73896 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/entity/MarkdownReq.java +++ b/common/src/main/java/org/dromara/dynamictp/common/entity/MarkdownReq.java @@ -65,7 +65,7 @@ public class MarkdownReq { private List atMobiles; - private boolean isAtAll; + private Boolean isAtAll; } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/entity/NotifyItem.java b/common/src/main/java/org/dromara/dynamictp/common/entity/NotifyItem.java index 2bc6ef96169f4966ffee56051eeff0954839b9f9..55a727a8902ef9dcdf988d3a2261dd5ebd21e1c4 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/entity/NotifyItem.java +++ b/common/src/main/java/org/dromara/dynamictp/common/entity/NotifyItem.java @@ -17,10 +17,12 @@ package org.dromara.dynamictp.common.entity; +import cn.hutool.core.collection.CollUtil; import lombok.Data; import lombok.val; import org.apache.commons.collections4.CollectionUtils; -import org.dromara.dynamictp.common.em.NotifyItemEnum; +import org.dromara.dynamictp.common.notifier.type.CommonNotifyItemType; +import org.dromara.dynamictp.common.notifier.type.NotifyItemTypeRegistry; import org.dromara.dynamictp.common.util.StringUtil; import java.util.ArrayList; @@ -28,7 +30,8 @@ import java.util.List; import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; - +import static org.dromara.dynamictp.common.util.DefaultValueUtil.setIfZero; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.*; /** * NotifyItem related * @@ -38,30 +41,35 @@ import static java.util.stream.Collectors.toList; @Data public class NotifyItem { - /** - * Notify platform id - */ - private List platformIds; - /** * If enabled notify. */ private boolean enabled = true; /** - * Notify item, see {@link NotifyItemEnum} + * Notify item, see {@link CommonNotifyItemType} */ private String type; /** - * Alarm threshold. + * Indicator detection threshold. */ private int threshold; /** - * Alarm interval, time unit(s) + * Within a cycle window, when the number of occurrences surpassing the threshold reaches the specified count, an alarm will be triggered. */ - private int interval = 120; + private int count; + + /** + * The time span (in seconds) of the cache applied to check alarm conditions. + */ + private int period = 120; + + /** + * When the alarm is triggered at Time - N (TN), it will stay silent from TN to TN + silencePeriod. + */ + private int silencePeriod = 120; /** * Cluster notify limit. @@ -73,60 +81,90 @@ public class NotifyItem { */ private String receivers; + /** + * Notify platform id + */ + private List platformIds; + public static List mergeAllNotifyItems(List source) { - // update notify items if (CollectionUtils.isEmpty(source)) { return getAllNotifyItems(); - } else { - val configuredTypes = source.stream().map(NotifyItem::getType).collect(toList()); - val defaultItems = getAllNotifyItems().stream() - .filter(t -> !StringUtil.containsIgnoreCase(t.getType(), configuredTypes)) - .collect(Collectors.toList()); - source.addAll(defaultItems); - return source; } + val configuredTypes = source.stream().map(NotifyItem::getType).collect(toList()); + val defaultItems = getAllNotifyItems().stream() + .filter(t -> !StringUtil.containsIgnoreCase(t.getType(), configuredTypes)) + .collect(Collectors.toList()); + List notifyItems = new ArrayList<>(6); + notifyItems.addAll(defaultItems); + populateDefaultValues(source); + notifyItems.addAll(source); + return notifyItems; } public static List getAllNotifyItems() { - NotifyItem rejectNotify = new NotifyItem(); - rejectNotify.setType(NotifyItemEnum.REJECT.getValue()); - rejectNotify.setThreshold(10); - - NotifyItem runTimeoutNotify = new NotifyItem(); - runTimeoutNotify.setType(NotifyItemEnum.RUN_TIMEOUT.getValue()); - runTimeoutNotify.setThreshold(10); - - NotifyItem queueTimeoutNotify = new NotifyItem(); - queueTimeoutNotify.setType(NotifyItemEnum.QUEUE_TIMEOUT.getValue()); - queueTimeoutNotify.setThreshold(10); - List notifyItems = new ArrayList<>(6); notifyItems.addAll(getSimpleNotifyItems()); - notifyItems.add(rejectNotify); - notifyItems.add(runTimeoutNotify); - notifyItems.add(queueTimeoutNotify); - + notifyItems.addAll(getFrameworkWithoutSimpleNotifyTypes()); + List customNotifyItems = getCustomNotifyItems(); + if (CollUtil.isNotEmpty(customNotifyItems)) { + notifyItems.addAll(customNotifyItems); + } + populateDefaultValues(notifyItems); return notifyItems; } - public static List getSimpleNotifyItems() { - NotifyItem changeNotify = new NotifyItem(); - changeNotify.setType(NotifyItemEnum.CHANGE.getValue()); - changeNotify.setInterval(1); - - NotifyItem livenessNotify = new NotifyItem(); - livenessNotify.setType(NotifyItemEnum.LIVENESS.getValue()); - livenessNotify.setThreshold(70); - - NotifyItem capacityNotify = new NotifyItem(); - capacityNotify.setType(NotifyItemEnum.CAPACITY.getValue()); - capacityNotify.setThreshold(70); + public static List getCustomNotifyItems() { + return NotifyItemTypeRegistry.getCustomNotifyTypes().stream() + .map(ele -> { + NotifyItem notifyItem = new NotifyItem(); + notifyItem.setType(ele.getNotifyType()); + return notifyItem; + }).collect(toList()); + } + public static List getSimpleNotifyItems() { List notifyItems = new ArrayList<>(3); - notifyItems.add(livenessNotify); - notifyItems.add(changeNotify); - notifyItems.add(capacityNotify); + NotifyItemTypeRegistry.getSimpleNotifyTypes().forEach(item -> { + NotifyItem notifyItem = new NotifyItem(); + notifyItem.setType(item.getType()); + if (item.getType().equals(CHANGE)) { + notifyItem.setSilencePeriod(1); + } + notifyItems.add(notifyItem); + }); + return notifyItems; + } + public static List getFrameworkWithoutSimpleNotifyTypes() { + List notifyItems = new ArrayList<>(3); + NotifyItemTypeRegistry.getFrameworkNotifyWithoutSimpleTypes().forEach(item -> { + NotifyItem notifyItem = new NotifyItem(); + notifyItem.setType(item.getType()); + notifyItems.add(notifyItem); + }); return notifyItems; } + + private static void populateDefaultValues(List source) { + if (CollectionUtils.isEmpty(source)) { + return; + } + for (NotifyItem item : source) { + CommonNotifyItemType notifyItemType = NotifyItemTypeRegistry.getNotifyItemType(item.getType()); + assert notifyItemType != null; + switch (notifyItemType.getType()) { + case REJECT: + setIfZero(item::getCount, item::setCount, 1); + break; + case RUN_TIMEOUT: + case QUEUE_TIMEOUT: + setIfZero(item::getCount, item::setCount, 10); + break; + default: + setIfZero(item::getThreshold, item::setThreshold, 70); + setIfZero(item::getCount, item::setCount, 1); + break; + } + } + } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/entity/NotifyPlatform.java b/common/src/main/java/org/dromara/dynamictp/common/entity/NotifyPlatform.java index 5a6fd4214d2a30ae8120a08a31b6b8d967808059..3b0e6e4527500222b244e04f49208701642e315a 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/entity/NotifyPlatform.java +++ b/common/src/main/java/org/dromara/dynamictp/common/entity/NotifyPlatform.java @@ -19,6 +19,7 @@ package org.dromara.dynamictp.common.entity; import lombok.Data; +import java.net.Proxy; import java.util.UUID; /** @@ -65,4 +66,21 @@ public class NotifyPlatform { * 默认3000毫秒 */ private Integer timeout = 3000; + + /** + * http请求代理类型
+ * 默认为DIRECT + */ + private Proxy.Type proxyType = Proxy.Type.DIRECT; + + /** + * http请求代理host + */ + private String proxyHost; + + /** + * http请求代理port + */ + private int proxyPort; + } diff --git a/common/src/main/java/org/dromara/dynamictp/common/entity/ThreadPoolStats.java b/common/src/main/java/org/dromara/dynamictp/common/entity/ThreadPoolStats.java index 06b4928b135ac3f8a07da5503693867e4abc9131..dc6c92ba7059a26c3d36a290dea8929861bcfb57 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/entity/ThreadPoolStats.java +++ b/common/src/main/java/org/dromara/dynamictp/common/entity/ThreadPoolStats.java @@ -20,7 +20,6 @@ package org.dromara.dynamictp.common.entity; import lombok.Data; import lombok.EqualsAndHashCode; - /** * ThreadPoolStats related * diff --git a/common/src/main/java/org/dromara/dynamictp/common/entity/TpExecutorProps.java b/common/src/main/java/org/dromara/dynamictp/common/entity/TpExecutorProps.java index 75f78dde7ae20b5a2ae33cba193490bfbfbf86f2..5815bb49906dfe3382db6d966a941163ed8d2322 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/entity/TpExecutorProps.java +++ b/common/src/main/java/org/dromara/dynamictp/common/entity/TpExecutorProps.java @@ -19,7 +19,8 @@ package org.dromara.dynamictp.common.entity; import lombok.Data; import org.dromara.dynamictp.common.constant.DynamicTpConst; -import org.dromara.dynamictp.common.em.NotifyItemEnum; +import org.dromara.dynamictp.common.em.RejectedTypeEnum; +import org.dromara.dynamictp.common.notifier.type.NotifyItemTypeRegistry; import java.util.List; import java.util.Set; @@ -44,6 +45,11 @@ public class TpExecutorProps { */ private String threadPoolAliasName; + /** + * Thread name prefix. + */ + private String threadNamePrefix = "dtp"; + /** * CoreSize of ThreadPool. */ @@ -67,7 +73,32 @@ public class TpExecutorProps { private TimeUnit unit = TimeUnit.SECONDS; /** - * Notify items, see {@link NotifyItemEnum} + * BlockingQueue capacity. + */ + private int queueCapacity = 1024; + + /** + * Max free memory for MemorySafeLBQ, unit M + */ + private int maxFreeMemory = 16; + + /** + * RejectedExecutionHandler type, see {@link RejectedTypeEnum} + */ + private String rejectedHandlerType = RejectedTypeEnum.ABORT_POLICY.getName(); + + /** + * If enhance reject. + */ + private boolean rejectEnhanced = true; + + /** + * If allow core thread timeout. + */ + private boolean allowCoreThreadTimeOut = false; + + /** + * Notify items, see {@link NotifyItemTypeRegistry} */ private List notifyItems; @@ -87,15 +118,28 @@ public class TpExecutorProps { private long runTimeout = 0; /** - * If try interrupt thread when run timeout. + * If try interrupt thread when task run timeout. */ private boolean tryInterrupt = false; /** - * Task queue wait timeout, unit (ms), just for statistics. + * Task queue wait timeout, unit (ms). */ private long queueTimeout = 0; + /** + * Whether to wait for scheduled tasks to complete on shutdown, + * not interrupting running tasks and executing all tasks in the queue. + */ + private boolean waitForTasksToCompleteOnShutdown = true; + + /** + * The maximum number of seconds that this executor is supposed to block + * on shutdown in order to wait for remaining tasks to complete their execution + * before the rest of the container continues to shut down. + */ + private int awaitTerminationSeconds = 3; + /** * Task wrapper names. */ @@ -105,4 +149,16 @@ public class TpExecutorProps { * Aware names. */ private List awareNames; + + /** + * check core param is inValid + * + * @return boolean return true means params is inValid + */ + public boolean coreParamIsInValid() { + return this.getCorePoolSize() < 0 + || this.getMaximumPoolSize() <= 0 + || this.getMaximumPoolSize() < this.getCorePoolSize() + || this.getKeepAliveTime() < 0; + } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/event/AlarmCheckEvent.java b/common/src/main/java/org/dromara/dynamictp/common/event/AlarmCheckEvent.java index ff5ab0f7f0dbb0712137ea16370577df467e46f9..52047ab936b2e593a5c872d0aed4c959926be12e 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/event/AlarmCheckEvent.java +++ b/common/src/main/java/org/dromara/dynamictp/common/event/AlarmCheckEvent.java @@ -18,7 +18,6 @@ package org.dromara.dynamictp.common.event; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.springframework.context.ApplicationEvent; /** * AlarmCheckEvent related @@ -26,16 +25,9 @@ import org.springframework.context.ApplicationEvent; * @author yanhom * @since 1.0.0 */ -public class AlarmCheckEvent extends ApplicationEvent { - - private final transient DtpProperties dtpProperties; +public class AlarmCheckEvent extends DtpEvent { public AlarmCheckEvent(Object source, DtpProperties dtpProperties) { - super(source); - this.dtpProperties = dtpProperties; - } - - public DtpProperties getDtpProperties() { - return dtpProperties; + super(source, dtpProperties); } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/event/CollectEvent.java b/common/src/main/java/org/dromara/dynamictp/common/event/CollectEvent.java index d796773e745f38af1406abbc495dbdd3a072ea7e..b2cc2fc640f0a1384548e18e6c8782f41db7ed6e 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/event/CollectEvent.java +++ b/common/src/main/java/org/dromara/dynamictp/common/event/CollectEvent.java @@ -18,7 +18,6 @@ package org.dromara.dynamictp.common.event; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.springframework.context.ApplicationEvent; /** * CollectEvent related @@ -26,16 +25,9 @@ import org.springframework.context.ApplicationEvent; * @author yanhom * @since 1.0.0 */ -public class CollectEvent extends ApplicationEvent { - - private final transient DtpProperties dtpProperties; +public class CollectEvent extends DtpEvent { public CollectEvent(Object source, DtpProperties dtpProperties) { - super(source); - this.dtpProperties = dtpProperties; - } - - public DtpProperties getDtpProperties() { - return dtpProperties; + super(source, dtpProperties); } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/event/CustomContextRefreshedEvent.java b/common/src/main/java/org/dromara/dynamictp/common/event/CustomContextRefreshedEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..5f203d053310ec8a4c18cb2197056a1fe4eb8420 --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/event/CustomContextRefreshedEvent.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.common.event; + +import java.util.EventObject; + +/** + * EventObject related + * + * @author vzer200 + * @since 1.2.0 + */ +public class CustomContextRefreshedEvent extends EventObject { + + public CustomContextRefreshedEvent(Object source) { + super(source); + } +} diff --git a/common/src/main/java/org/dromara/dynamictp/common/event/DtpEvent.java b/common/src/main/java/org/dromara/dynamictp/common/event/DtpEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..7d2198348da3d1e6e811d36892602c1174db6a81 --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/event/DtpEvent.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.common.event; + +import lombok.Getter; +import org.dromara.dynamictp.common.properties.DtpProperties; + +import java.util.EventObject; + +/** + * DtpEvent related + * + * @author vzer200 + * @since 1.2.0 + */ +@Getter +public abstract class DtpEvent extends EventObject { + + private final transient DtpProperties dtpProperties; + + protected DtpEvent(Object source, DtpProperties dtpProperties) { + super(source); + this.dtpProperties = dtpProperties; + } + +} diff --git a/common/src/main/java/org/dromara/dynamictp/common/event/RefreshEvent.java b/common/src/main/java/org/dromara/dynamictp/common/event/RefreshEvent.java index caf52aeb118d371dcba4c612e64f260b146a94fb..157b2843a56b301043decb32dc7ec434a6fe6627 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/event/RefreshEvent.java +++ b/common/src/main/java/org/dromara/dynamictp/common/event/RefreshEvent.java @@ -18,7 +18,6 @@ package org.dromara.dynamictp.common.event; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.springframework.context.ApplicationEvent; /** * RefreshEvent related @@ -26,16 +25,9 @@ import org.springframework.context.ApplicationEvent; * @author yanhom * @since 1.0.0 */ -public class RefreshEvent extends ApplicationEvent { - - private final transient DtpProperties dtpProperties; +public class RefreshEvent extends DtpEvent { public RefreshEvent(Object source, DtpProperties dtpProperties) { - super(source); - this.dtpProperties = dtpProperties; - } - - public DtpProperties getDtpProperties() { - return dtpProperties; + super(source, dtpProperties); } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/manager/ContextManager.java b/common/src/main/java/org/dromara/dynamictp/common/manager/ContextManager.java new file mode 100644 index 0000000000000000000000000000000000000000..2b99f9770dc3fea94874195c9ef89ebffee68a2f --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/manager/ContextManager.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.common.manager; + +import java.util.Map; + +/** + * Interface for managing context in the application. + * Provides methods to access beans, set context, handle events, + * and retrieve environment properties. + * + * @author vzer200 + * @since 1.2.0 + */ +public interface ContextManager { + + /** + * Retrieves a bean by its class type. + * + * @param the type of the bean + * @param clazz the class of the bean + * @return an instance of the bean, or null if not found + */ + T getBean(Class clazz); + + /** + * Retrieves a bean by its name and class type. + * + * @param the type of the bean + * @param name the name of the bean + * @param clazz the class of the bean + * @return an instance of the bean, or null if not found + */ + T getBean(String name, Class clazz); + + /** + * Retrieves all beans of the specified type. + * + * @param the type of the beans + * @param clazz the class of the beans + * @return a map of bean names to bean instances + */ + Map getBeansOfType(Class clazz); + + /** + * Retrieves the environment. + * + * @return the environment object + */ + Object getEnvironment(); + + /** + * Retrieves an environment property by its key. + * + * @param key the key of the property + * @return the value of the property, or null if not found + */ + String getEnvironmentProperty(String key); + + /** + * Retrieves an environment property by its key in the specified environment. + * + * @param key the key of the property + * @param environment the specified environment object + * @return the value of the property, or null if not found + */ + String getEnvironmentProperty(String key, Object environment); + + /** + * Retrieves an environment property by its key, with a default value. + * + * @param key the key of the property + * @param defaultValue the default value to return if the property is not found + * @return the value of the property, or the default value if not found + */ + String getEnvironmentProperty(String key, String defaultValue); +} diff --git a/common/src/main/java/org/dromara/dynamictp/common/manager/ContextManagerHelper.java b/common/src/main/java/org/dromara/dynamictp/common/manager/ContextManagerHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..4ba0e34f7b0d16754ed04a1ef7acc6137da8e67d --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/manager/ContextManagerHelper.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.common.manager; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.common.util.ExtensionServiceLoader; + +import java.util.Map; + +/** + * Helper class for accessing ContextManager. + * + * @author vzer200 + * @since 1.2.0 + */ +@Slf4j +public class ContextManagerHelper { + + private static ContextManager contextManager; + + static { + contextManager = ExtensionServiceLoader.getFirst(ContextManager.class); + if (contextManager == null) { + contextManager = new NullContextManager(); + throw new IllegalStateException("No ContextManager implementation found"); + } + } + + public static T getBean(Class clazz) { + return contextManager.getBean(clazz); + } + + public static T getBean(String name, Class clazz) { + return contextManager.getBean(name, clazz); + } + + public static Map getBeansOfType(Class clazz) { + return contextManager.getBeansOfType(clazz); + } + + public static Object getEnvironment() { + return contextManager.getEnvironment(); + } + + public static String getEnvironmentProperty(String key) { + return contextManager.getEnvironmentProperty(key); + } + + public static String getEnvironmentProperty(String key, Object environment) { + return contextManager.getEnvironmentProperty(key, environment); + } + + public static String getEnvironmentProperty(String key, String defaultValue) { + return contextManager.getEnvironmentProperty(key, defaultValue); + } +} + diff --git a/common/src/main/java/org/dromara/dynamictp/common/manager/EventBusManager.java b/common/src/main/java/org/dromara/dynamictp/common/manager/EventBusManager.java new file mode 100644 index 0000000000000000000000000000000000000000..ad13a455e7ffee4ccc793d91b6a16db32f6e8a2e --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/manager/EventBusManager.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.common.manager; + +import com.google.common.eventbus.EventBus; +import lombok.extern.slf4j.Slf4j; + +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Manages event registration and posting using EventBus. + * + * @author vzer200 + * @since 1.2.0 + */ +@Slf4j +public class EventBusManager { + + private static final EventBus EVENT_BUS = new EventBus(); + + private static final Set REGISTERED_OBJECTS = ConcurrentHashMap.newKeySet(); + + private EventBusManager() { } + + public static void register(Object object) { + if (REGISTERED_OBJECTS.add(object)) { + EVENT_BUS.register(object); + } + } + + public static void unregister(Object object) { + if (REGISTERED_OBJECTS.remove(object)) { + try { + EVENT_BUS.unregister(object); + } catch (IllegalArgumentException e) { + // log warning or handle the case where the object is not registered + log.warn("Attempted to unregister an object that was not registered: {}", object, e); + } + } + } + + public static void post(Object event) { + EVENT_BUS.post(event); + } + + public static EventBus getInstance() { + return EVENT_BUS; + } + + public static void destroy() { + for (Object object : REGISTERED_OBJECTS) { + try { + EVENT_BUS.unregister(object); + } catch (Exception e) { + log.warn("Attempted to unregister an object that was not registered: {}", object, e); + } + } + REGISTERED_OBJECTS.clear(); + } +} + diff --git a/adapter/adapter-hystrix/src/main/java/org/dromara/dynamictp/adapter/hystrix/DtpHystrixMetricsPublisher.java b/common/src/main/java/org/dromara/dynamictp/common/manager/NullContextManager.java similarity index 39% rename from adapter/adapter-hystrix/src/main/java/org/dromara/dynamictp/adapter/hystrix/DtpHystrixMetricsPublisher.java rename to common/src/main/java/org/dromara/dynamictp/common/manager/NullContextManager.java index 0ebfaabcdf3ffcf061f16c45942207811bd09f19..74a14385141585bd6b83117995b276f889f0ade5 100644 --- a/adapter/adapter-hystrix/src/main/java/org/dromara/dynamictp/adapter/hystrix/DtpHystrixMetricsPublisher.java +++ b/common/src/main/java/org/dromara/dynamictp/common/manager/NullContextManager.java @@ -15,35 +15,51 @@ * limitations under the License. */ -package org.dromara.dynamictp.adapter.hystrix; +package org.dromara.dynamictp.common.manager; -import com.netflix.hystrix.HystrixThreadPoolKey; -import com.netflix.hystrix.HystrixThreadPoolMetrics; -import com.netflix.hystrix.HystrixThreadPoolProperties; -import com.netflix.hystrix.strategy.metrics.HystrixMetricsPublisher; -import com.netflix.hystrix.strategy.metrics.HystrixMetricsPublisherThreadPool; -import lombok.val; +import java.util.Collections; +import java.util.Map; /** - * DtpHystrixMetricsPublisher related + * NullContextManager related * * @author yanhom - * @since 1.0.8 + * @since 1.2.0 */ -public class DtpHystrixMetricsPublisher extends HystrixMetricsPublisher { - private final HystrixMetricsPublisher metricsPublisher; +public class NullContextManager implements ContextManager { - public DtpHystrixMetricsPublisher(HystrixMetricsPublisher metricsPublisher) { - this.metricsPublisher = metricsPublisher; + @Override + public T getBean(Class clazz) { + return null; } @Override - public HystrixMetricsPublisherThreadPool getMetricsPublisherForThreadPool(HystrixThreadPoolKey threadPoolKey, - HystrixThreadPoolMetrics metrics, - HystrixThreadPoolProperties properties) { - val metricsPublisherForThreadPool = - metricsPublisher.getMetricsPublisherForThreadPool(threadPoolKey, metrics, properties); - return new DtpMetricsPublisherThreadPool(threadPoolKey, metrics, properties, metricsPublisherForThreadPool); + public T getBean(String name, Class clazz) { + return null; + } + + @Override + public Map getBeansOfType(Class clazz) { + return Collections.emptyMap(); } -} + @Override + public Object getEnvironment() { + return null; + } + + @Override + public String getEnvironmentProperty(String key) { + return null; + } + + @Override + public String getEnvironmentProperty(String key, Object environment) { + return null; + } + + @Override + public String getEnvironmentProperty(String key, String defaultValue) { + return null; + } +} diff --git a/common/src/main/java/org/dromara/dynamictp/common/notifier/AbstractHttpNotifier.java b/common/src/main/java/org/dromara/dynamictp/common/notifier/AbstractHttpNotifier.java index b7580f9bc6c588324b598a4ede934d9e69637bd4..bad01c480d702cbaf44d113ffe524cbbe5382b12 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/notifier/AbstractHttpNotifier.java +++ b/common/src/main/java/org/dromara/dynamictp/common/notifier/AbstractHttpNotifier.java @@ -23,6 +23,8 @@ import lombok.extern.slf4j.Slf4j; import lombok.val; import org.dromara.dynamictp.common.entity.NotifyPlatform; +import java.net.InetSocketAddress; +import java.net.Proxy; import java.util.Objects; /** @@ -42,6 +44,9 @@ public abstract class AbstractHttpNotifier extends AbstractNotifier { .setConnectionTimeout(platform.getTimeout()) .setReadTimeout(platform.getTimeout()) .body(msgBody); + if (platform.getProxyType() != Proxy.Type.DIRECT) { + request.setProxy(new Proxy(platform.getProxyType(), new InetSocketAddress(platform.getProxyHost(), platform.getProxyPort()))); + } HttpResponse response = request.execute(); if (Objects.nonNull(response)) { log.info("DynamicTp notify, {} send success, response: {}, request: {}", diff --git a/common/src/main/java/org/dromara/dynamictp/common/notifier/DingNotifier.java b/common/src/main/java/org/dromara/dynamictp/common/notifier/DingNotifier.java index fb662cedfb7d913c4b7cd3c6cc1306fbaadd1123..d586724728c925040370850de11617a6818d8bfa 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/notifier/DingNotifier.java +++ b/common/src/main/java/org/dromara/dynamictp/common/notifier/DingNotifier.java @@ -62,7 +62,7 @@ public class DingNotifier extends AbstractHttpNotifier { List mobiles = Lists.newArrayList(platform.getReceivers().split(",")); at.setAtMobiles(mobiles); if (mobiles.contains(ALL) || CollectionUtils.isEmpty(mobiles)) { - at.setAtAll(true); + at.setIsAtAll(true); } MarkdownReq markdownReq = new MarkdownReq(); diff --git a/common/src/main/java/org/dromara/dynamictp/common/notifier/type/AbstractCustomAlarmType.java b/common/src/main/java/org/dromara/dynamictp/common/notifier/type/AbstractCustomAlarmType.java new file mode 100644 index 0000000000000000000000000000000000000000..c51efbfe02c01fc0d558b5b789a42f8cfbff2791 --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/notifier/type/AbstractCustomAlarmType.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.common.notifier.type; + + +import com.google.common.collect.Lists; +import org.dromara.dynamictp.common.em.NotifyItemTypeGroupEnum; + +public abstract class AbstractCustomAlarmType extends CommonNotifyItemType { + + public AbstractCustomAlarmType() { + super(Lists.newArrayList(NotifyItemTypeGroupEnum.CUSTOM)); + } + + /** + * custom business notify type + */ + public abstract String getNotifyType(); +} diff --git a/common/src/main/java/org/dromara/dynamictp/common/notifier/type/CommonNotifyItemType.java b/common/src/main/java/org/dromara/dynamictp/common/notifier/type/CommonNotifyItemType.java new file mode 100644 index 0000000000000000000000000000000000000000..98883b4295a6502d4980434453eca89e109d0fc6 --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/notifier/type/CommonNotifyItemType.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.dynamictp.common.notifier.type; + +import cn.hutool.core.collection.CollUtil; +import lombok.Getter; +import org.dromara.dynamictp.common.em.NotifyItemTypeGroupEnum; + +import java.util.*; + +@Getter +public class CommonNotifyItemType { + private String type; + private final Set groupEnums = new HashSet<>(); + + public CommonNotifyItemType(List groupEnums) { + new CommonNotifyItemType("", groupEnums); + } + + public CommonNotifyItemType(String type, List groupEnums) { + this.type = type; + if (CollUtil.isNotEmpty(groupEnums)) { + this.groupEnums.addAll(groupEnums); + } + } + + protected void setType(String type) { + this.type = type; + } + + public Set getGroupEnums() { + return groupEnums; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + CommonNotifyItemType that = (CommonNotifyItemType) o; + return Objects.equals(type, that.type); + } + + @Override + public int hashCode() { + return Objects.hashCode(type); + } +} diff --git a/common/src/main/java/org/dromara/dynamictp/common/notifier/type/NotifyItemTypeRegistry.java b/common/src/main/java/org/dromara/dynamictp/common/notifier/type/NotifyItemTypeRegistry.java new file mode 100644 index 0000000000000000000000000000000000000000..35b04799c0d7bfa57441aec220f1c8e1381535c6 --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/notifier/type/NotifyItemTypeRegistry.java @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.dynamictp.common.notifier.type; + +import cn.hutool.core.collection.CollUtil; +import com.google.common.collect.Lists; +import org.dromara.dynamictp.common.em.NotifyItemTypeGroupEnum; +import org.dromara.dynamictp.common.util.ExtensionServiceLoader; + +import java.util.List; +import java.util.stream.Collectors; + +import static org.dromara.dynamictp.common.constant.DynamicTpConst.*; + +public class NotifyItemTypeRegistry { + + // notify by schedule + private static final List SCHEDULE_NOTIFY_TYPES; + private static final List SIMPLE_NOTIFY_TYPES; + private static final List FRAMEWORK_NOTIFY_WITHOUT_SIMPLE_TYPES; + // dynamic tp core notify + private static final List FRAMEWORK_NOTIFY_TYPES; + // custom extension notify + private static final List CUSTOM_NOTIFY_TYPES = Lists.newArrayListWithCapacity(0); + + static { + SCHEDULE_NOTIFY_TYPES = Lists.newArrayList(LIVENESS, CAPACITY) + .stream() + .map(ele -> new CommonNotifyItemType(ele, Lists.newArrayList(NotifyItemTypeGroupEnum.SCHEDULE))) + .collect(Collectors.toList()); + + SIMPLE_NOTIFY_TYPES = Lists.newArrayList(CHANGE) + .stream() + .map(ele -> new CommonNotifyItemType(ele, Lists.newArrayList(NotifyItemTypeGroupEnum.SIMPLE))) + .collect(Collectors.toList()); + SCHEDULE_NOTIFY_TYPES.forEach(ele -> { + ele.getGroupEnums().add(NotifyItemTypeGroupEnum.SIMPLE); + SIMPLE_NOTIFY_TYPES.add(ele); + }); + + FRAMEWORK_NOTIFY_WITHOUT_SIMPLE_TYPES = Lists.newArrayList(REJECT, RUN_TIMEOUT, QUEUE_TIMEOUT) + .stream() + .map(ele -> new CommonNotifyItemType(ele, Lists.newArrayList(NotifyItemTypeGroupEnum.FRAMEWORK_WITHOUT_SIMPLE))) + .collect(Collectors.toList()); + + FRAMEWORK_NOTIFY_TYPES = Lists.newArrayListWithCapacity(SIMPLE_NOTIFY_TYPES.size() + FRAMEWORK_NOTIFY_WITHOUT_SIMPLE_TYPES.size()); + FRAMEWORK_NOTIFY_TYPES.addAll(SIMPLE_NOTIFY_TYPES); + FRAMEWORK_NOTIFY_TYPES.addAll(FRAMEWORK_NOTIFY_WITHOUT_SIMPLE_TYPES); + + List customAlamType = ExtensionServiceLoader.get(AbstractCustomAlarmType.class); + if (CollUtil.isNotEmpty(customAlamType)) { + customAlamType.forEach(ele -> { + ele.setType(ele.getNotifyType()); + ele.getGroupEnums().add(NotifyItemTypeGroupEnum.CUSTOM); + CUSTOM_NOTIFY_TYPES.add(ele); + }); + } + } + + public static List getScheduleNotifyTypes() { + return SCHEDULE_NOTIFY_TYPES; + } + + public static List getSimpleNotifyTypes() { + return SIMPLE_NOTIFY_TYPES; + } + + public static List getFrameworkNotifyWithoutSimpleTypes() { + return FRAMEWORK_NOTIFY_WITHOUT_SIMPLE_TYPES; + } + + public static List getFrameworkNotifyTypes() { + return FRAMEWORK_NOTIFY_TYPES; + } + + public static List getCustomNotifyTypes() { + return CUSTOM_NOTIFY_TYPES; + } + + public static CommonNotifyItemType getNotifyItemType(String type) { + CommonNotifyItemType commonNotifyItemType = FRAMEWORK_NOTIFY_TYPES.stream() + .filter(ele -> ele.getType().equals(type)) + .findFirst() + .orElse(null); + if (commonNotifyItemType == null) { + // search from custom + commonNotifyItemType = CUSTOM_NOTIFY_TYPES.stream() + .filter(ele -> ele.getType().equals(type)) + .findFirst() + .orElse(null); + } + return commonNotifyItemType; + } + +} diff --git a/common/src/main/java/org/dromara/dynamictp/common/parser/config/YamlConfigParser.java b/common/src/main/java/org/dromara/dynamictp/common/parser/config/YamlConfigParser.java index af7fd6d2da9791019dc03e71011b6f52c7793321..201f247cd78a3d16a9c993530ebe0b0d8f08e882 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/parser/config/YamlConfigParser.java +++ b/common/src/main/java/org/dromara/dynamictp/common/parser/config/YamlConfigParser.java @@ -17,13 +17,15 @@ package org.dromara.dynamictp.common.parser.config; -import org.dromara.dynamictp.common.em.ConfigFileTypeEnum; -import com.google.common.collect.Lists; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; -import org.springframework.core.io.ByteArrayResource; +import org.dromara.dynamictp.common.em.ConfigFileTypeEnum; +import org.yaml.snakeyaml.Yaml; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -35,7 +37,7 @@ import java.util.Map; **/ public class YamlConfigParser extends AbstractConfigParser { - private static final List CONFIG_TYPES = Lists.newArrayList( + private static final List CONFIG_TYPES = Arrays.asList( ConfigFileTypeEnum.YML, ConfigFileTypeEnum.YAML); @Override @@ -45,12 +47,36 @@ public class YamlConfigParser extends AbstractConfigParser { @Override public Map doParse(String content) { + if (StringUtils.isBlank(content)) { + return Collections.emptyMap(); + } - if (StringUtils.isEmpty(content)) { + Yaml yaml = new Yaml(); + Map loadedYaml = yaml.load(content); + + if (MapUtils.isEmpty(loadedYaml)) { return Collections.emptyMap(); } - YamlPropertiesFactoryBean bean = new YamlPropertiesFactoryBean(); - bean.setResources(new ByteArrayResource(content.getBytes())); - return bean.getObject(); + + Map flattenedMap = new LinkedHashMap<>(); + flattenMap(flattenedMap, loadedYaml, null); + return flattenedMap; + } + + @SuppressWarnings("unchecked") + private void flattenMap(Map result, Map source, String path) { + source.forEach((key, value) -> { + String fullPath = (path != null ? path + "." + key : key.toString()); + if (value instanceof Map) { + flattenMap(result, (Map) value, fullPath); + } else if (value instanceof Collection) { + for (int i = 0; i < ((Collection) value).size(); i++) { + flattenMap(result, Collections.singletonMap("[" + i + "]", ((List) value).get(i)), fullPath); + } + } else { + fullPath = fullPath.replaceAll("\\.\\[", "["); + result.put(fullPath, value != null ? value.toString() : null); + } + }); } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/parser/json/AbstractJsonParser.java b/common/src/main/java/org/dromara/dynamictp/common/parser/json/AbstractJsonParser.java index a8211bd8ba503b3a894a84f89ee2c805ebac07d1..2e6d52f29a7249277b79291b8f8c2a952da402e7 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/parser/json/AbstractJsonParser.java +++ b/common/src/main/java/org/dromara/dynamictp/common/parser/json/AbstractJsonParser.java @@ -17,21 +17,28 @@ package org.dromara.dynamictp.common.parser.json; +import lombok.extern.slf4j.Slf4j; + /** * * @author topsuder * @since 1.1.3 */ +@Slf4j public abstract class AbstractJsonParser implements JsonParser { @Override public boolean supports() { - try { - Class.forName(getMapperClassName()); - return true; - } catch (ClassNotFoundException e) { - return false; + String[] mapperClassNames = getMapperClassNames(); + for (String mapperClassName : mapperClassNames) { + try { + Class.forName(mapperClassName); + } catch (ClassNotFoundException e) { + log.warn("the current parser is {}, Can not find class: {}", this.getClass().getSimpleName(), mapperClassName); + return false; + } } + return true; } /** @@ -39,5 +46,5 @@ public abstract class AbstractJsonParser implements JsonParser { * * @return mapper class name */ - protected abstract String getMapperClassName(); + protected abstract String[] getMapperClassNames(); } diff --git a/common/src/main/java/org/dromara/dynamictp/common/parser/json/FastJsonParser.java b/common/src/main/java/org/dromara/dynamictp/common/parser/json/FastJsonParser.java index fb0d44b86350010effdf91536acbfc5598b565ab..082b166f6427a2681ac635e7185088ffe70a61af 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/parser/json/FastJsonParser.java +++ b/common/src/main/java/org/dromara/dynamictp/common/parser/json/FastJsonParser.java @@ -42,7 +42,7 @@ public class FastJsonParser extends AbstractJsonParser { } @Override - protected String getMapperClassName() { - return PACKAGE_NAME; + protected String[] getMapperClassNames() { + return new String[]{PACKAGE_NAME}; } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/parser/json/GsonParser.java b/common/src/main/java/org/dromara/dynamictp/common/parser/json/GsonParser.java index ed535621f6234f36ec91307288d9dcc5ed1aa760..9e429c0dbc85a5732e776e06c22dded36f6d8d0a 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/parser/json/GsonParser.java +++ b/common/src/main/java/org/dromara/dynamictp/common/parser/json/GsonParser.java @@ -93,7 +93,7 @@ public class GsonParser extends AbstractJsonParser { } @Override - protected String getMapperClassName() { - return PACKAGE_NAME; + protected String[] getMapperClassNames() { + return new String[]{PACKAGE_NAME}; } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonCreator.java b/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..f50e66f5edb6ca7ff8dce2d5f269c5f2f672f61c --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonCreator.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.common.parser.json; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; + +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * @author KamTo Hung + */ +public class JacksonCreator { + + private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + protected static ObjectMapper createMapper() { + JavaTimeModule javaTimeModule = new JavaTimeModule(); + javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT))); + javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT))); + return JsonMapper.builder() + .configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true) + // 反序列化时,遇到未知属性会不会报错 true - 遇到没有的属性就报错 false - 没有的属性不会管,不会报错 + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + // 如果是空对象的时候,不抛异常 + .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) + // 序列化的时候序列对象的那些属性 + .serializationInclusion(JsonInclude.Include.NON_EMPTY) + .addModules(javaTimeModule) + .addModules(new JavaTimeModule()) + // 修改序列化后日期格式 + .defaultDateFormat(new SimpleDateFormat(DATE_FORMAT)) + .build(); + } + +} diff --git a/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonParser.java b/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonParser.java index f6bebed657c1d070cb07cbad9a91983a9b95cfb7..90ec08845450ae0e4908f1270c0a3fc5cad37ac4 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonParser.java +++ b/common/src/main/java/org/dromara/dynamictp/common/parser/json/JacksonParser.java @@ -17,34 +17,24 @@ package org.dromara.dynamictp.common.parser.json; -import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import lombok.extern.slf4j.Slf4j; import java.io.IOException; import java.lang.reflect.Type; -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; /** - * * @author topsuder * @since 1.1.3 */ @Slf4j public class JacksonParser extends AbstractJsonParser { - private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; private static final String PACKAGE_NAME = "com.fasterxml.jackson.databind.ObjectMapper"; + + private static final String JAVA_TIME_MODULE_CLASS_NAME = "com.fasterxml.jackson.datatype.jsr310.JavaTimeModule"; + private volatile ObjectMapper mapper; @Override @@ -79,27 +69,11 @@ public class JacksonParser extends AbstractJsonParser { } protected ObjectMapper createMapper() { - // 只提供最简单的方案 - JavaTimeModule javaTimeModule = new JavaTimeModule(); - javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - return JsonMapper.builder() - .configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true) - // 反序列化时,遇到未知属性会不会报错 true - 遇到没有的属性就报错 false - 没有的属性不会管,不会报错 - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - // 如果是空对象的时候,不抛异常 - .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) - // 序列化的时候序列对象的那些属性 - .serializationInclusion(JsonInclude.Include.NON_EMPTY) - .addModules(javaTimeModule) - .addModules(new JavaTimeModule()) - // 修改序列化后日期格式 - .defaultDateFormat(new SimpleDateFormat(DATE_FORMAT)) - .build(); + return JacksonCreator.createMapper(); } @Override - protected String getMapperClassName() { - return PACKAGE_NAME; + protected String[] getMapperClassNames() { + return new String[]{PACKAGE_NAME, JAVA_TIME_MODULE_CLASS_NAME}; } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/plugin/DtpInterceptorProxyFactory.java b/common/src/main/java/org/dromara/dynamictp/common/plugin/DtpInterceptorProxyFactory.java index 64a62da53da965371a37b37f37b33c525ecb0af6..c981e92bf69b79cfaee1fd608b706291ca546ba3 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/plugin/DtpInterceptorProxyFactory.java +++ b/common/src/main/java/org/dromara/dynamictp/common/plugin/DtpInterceptorProxyFactory.java @@ -18,7 +18,12 @@ package org.dromara.dynamictp.common.plugin; import com.google.common.collect.Maps; -import net.sf.cglib.proxy.Enhancer; +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; +import net.bytebuddy.implementation.InvocationHandlerAdapter; +import net.bytebuddy.implementation.attribute.MethodAttributeAppender; +import net.bytebuddy.matcher.ElementMatchers; +import org.dromara.dynamictp.common.util.UUIDUtil; import java.lang.reflect.Method; import java.util.HashSet; @@ -43,13 +48,25 @@ public class DtpInterceptorProxyFactory { if (!signatureMap.containsKey(target.getClass())) { return target; } - Enhancer enhancer = new Enhancer(); - enhancer.setSuperclass(target.getClass()); - enhancer.setCallback(new DtpInterceptorProxy(target, interceptor, signatureMap)); - if (Objects.isNull(argumentTypes) || Objects.isNull(arguments)) { - return enhancer.create(); + try { + Class proxyClass = new ByteBuddy() + .subclass(target.getClass()) + .name(String.format("%s$ByteBuddy$%s", target.getClass().getName(), UUIDUtil.genUuid(5))) + .method(ElementMatchers.any()) + .intercept(InvocationHandlerAdapter.of(new DtpInvocationHandler(target, interceptor, signatureMap))) + .attribute(MethodAttributeAppender.ForInstrumentedMethod.INCLUDING_RECEIVER) + .annotateType(target.getClass().getAnnotations()) + .make() + .load(DtpInterceptorProxyFactory.class.getClassLoader(), ClassLoadingStrategy.Default.INJECTION) + .getLoaded(); + + if (Objects.isNull(argumentTypes) || Objects.isNull(arguments)) { + return proxyClass.getDeclaredConstructor().newInstance(); + } + return proxyClass.getDeclaredConstructor(argumentTypes).newInstance(arguments); + } catch (Exception e) { + throw new PluginException("Failed to create proxy instance", e); } - return enhancer.create(argumentTypes, arguments); } private static Map, Set> getSignatureMap(DtpInterceptor interceptor) { @@ -57,7 +74,6 @@ public class DtpInterceptorProxyFactory { if (interceptsAnno == null) { throw new PluginException("No @DtpIntercepts annotation was found in interceptor " + interceptor.getClass().getName()); } - DtpSignature[] signatures = interceptsAnno.signatures(); Map, Set> signatureMap = Maps.newHashMap(); for (DtpSignature signature : signatures) { diff --git a/common/src/main/java/org/dromara/dynamictp/common/plugin/DtpInterceptorProxy.java b/common/src/main/java/org/dromara/dynamictp/common/plugin/DtpInvocationHandler.java similarity index 78% rename from common/src/main/java/org/dromara/dynamictp/common/plugin/DtpInterceptorProxy.java rename to common/src/main/java/org/dromara/dynamictp/common/plugin/DtpInvocationHandler.java index 40b3f614b35aeb4ed11cffe065cca5a3addea3a3..f94dba8826fe7a8ef361d8796369df127cd13666 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/plugin/DtpInterceptorProxy.java +++ b/common/src/main/java/org/dromara/dynamictp/common/plugin/DtpInvocationHandler.java @@ -17,19 +17,20 @@ package org.dromara.dynamictp.common.plugin; -import net.sf.cglib.proxy.MethodInterceptor; -import net.sf.cglib.proxy.MethodProxy; import org.apache.commons.collections4.CollectionUtils; +import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.Map; import java.util.Set; /** - * @author windsearcher.lq - * @since 1.1.4 + * DtpInvocationHandler related + * + * @author yanhom + * @since 1.2.1 */ -public class DtpInterceptorProxy implements MethodInterceptor { +public class DtpInvocationHandler implements InvocationHandler { private final Object target; @@ -37,19 +38,18 @@ public class DtpInterceptorProxy implements MethodInterceptor { private final Map, Set> signatureMap; - public DtpInterceptorProxy(Object target, DtpInterceptor interceptor, Map, Set> signatureMap) { + public DtpInvocationHandler(Object target, DtpInterceptor interceptor, Map, Set> signatureMap) { this.target = target; this.interceptor = interceptor; this.signatureMap = signatureMap; } @Override - public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Set methods = signatureMap.get(method.getDeclaringClass()); if (CollectionUtils.isNotEmpty(methods) && methods.contains(method)) { return interceptor.intercept(new DtpInvocation(target, method, args)); } - return method.invoke(target, args); } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/properties/DtpProperties.java b/common/src/main/java/org/dromara/dynamictp/common/properties/DtpProperties.java index c288aefa49ec358a13e4a38d4919b87ada707a7a..781f01f887370dc37accedfbb0c08577c91e4ec4 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/properties/DtpProperties.java +++ b/common/src/main/java/org/dromara/dynamictp/common/properties/DtpProperties.java @@ -43,7 +43,7 @@ public class DtpProperties { private boolean enabled = true; /** - * Environment, if not set, will use "spring.profiles.active". + * Environment, if not set, will use "APP.ENV". */ private String env; @@ -92,6 +92,11 @@ public class DtpProperties { */ private Etcd etcd; + /** + * ThreadPoolExecutor global configs. + */ + private DtpExecutorProps globalExecutorProps; + /** * ThreadPoolExecutor configs. */ @@ -161,6 +166,16 @@ public class DtpProperties { * Rabbitmq thread pools. */ private List rabbitmqTp; + + /** + * Liteflow thread pools. + */ + private List liteflowTp; + + /** + * Thrift thread pools. + */ + private List thriftTp; public static DtpProperties getInstance() { return Holder.INSTANCE; @@ -199,6 +214,8 @@ public class DtpProperties { private String authority = "ssl"; private String key; + + private long timeout = 30000L; } private static class Holder { diff --git a/common/src/main/java/org/dromara/dynamictp/common/util/CommonUtil.java b/common/src/main/java/org/dromara/dynamictp/common/util/CommonUtil.java index 4ca11751fb7c7fbb2343338c812bd10711e0608a..e722114577e3f70b3c08b31e7876e4f2b23db998 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/util/CommonUtil.java +++ b/common/src/main/java/org/dromara/dynamictp/common/util/CommonUtil.java @@ -17,12 +17,11 @@ package org.dromara.dynamictp.common.util; -import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; -import org.dromara.dynamictp.common.entity.ServiceInstance; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.core.env.Environment; +import org.dromara.dynamictp.common.entity.ServiceInstance; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; +import org.dromara.dynamictp.common.properties.DtpProperties; import java.net.InetAddress; import java.net.NetworkInterface; @@ -30,6 +29,10 @@ import java.net.SocketException; import java.net.UnknownHostException; import java.util.Enumeration; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.APP_ENV_KEY; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.APP_NAME_KEY; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.APP_PORT_KEY; + /** * CommonUtil related * @@ -44,14 +47,6 @@ public final class CommonUtil { private static final ServiceInstance SERVICE_INSTANCE; static { - Environment environment = ApplicationContextHolder.getEnvironment(); - - String appName = environment.getProperty("spring.application.name"); - appName = StringUtils.isNoneBlank(appName) ? appName : "application"; - - String portStr = environment.getProperty("server.port"); - int port = StringUtils.isNotBlank(portStr) ? Integer.parseInt(portStr) : 0; - String address = null; try { address = getLocalHostExactAddress().getHostAddress(); @@ -61,19 +56,11 @@ public final class CommonUtil { String env = DtpProperties.getInstance().getEnv(); if (StringUtils.isBlank(env)) { - // fix #I8SSGQ - env = environment.getProperty("spring.profiles.active"); + env = ContextManagerHelper.getEnvironmentProperty(APP_ENV_KEY); } - if (StringUtils.isBlank(env)) { - String[] profiles = environment.getActiveProfiles(); - if (profiles.length < 1) { - profiles = environment.getDefaultProfiles(); - } - if (profiles.length >= 1) { - env = profiles[0]; - } - } - + String appName = ContextManagerHelper.getEnvironmentProperty(APP_NAME_KEY); + String portStr = ContextManagerHelper.getEnvironmentProperty(APP_PORT_KEY); + int port = StringUtils.isNotBlank(portStr) ? Integer.parseInt(portStr) : 0; SERVICE_INSTANCE = new ServiceInstance(address, port, appName, env); } diff --git a/common/src/main/java/org/dromara/dynamictp/common/util/DefaultValueUtil.java b/common/src/main/java/org/dromara/dynamictp/common/util/DefaultValueUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..e503451ea35125cde4fd54dd64b04b5944289472 --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/util/DefaultValueUtil.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.common.util; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * DefaultValueUtil related + * + * @author yanhom + * @since 1.2.1 + **/ +public final class DefaultValueUtil { + + private DefaultValueUtil() { + } + + public static void setIfZero(Supplier getter, Consumer setter, T defaultValue) { + T value = getter.get(); + if (value == null || value.intValue() == 0) { + setter.accept(defaultValue); + } + } +} diff --git a/common/src/main/java/org/dromara/dynamictp/common/util/DtpPropertiesBinderUtil.java b/common/src/main/java/org/dromara/dynamictp/common/util/DtpPropertiesBinderUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..fa1769558f173d0222232ff48d48d620058e47df --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/util/DtpPropertiesBinderUtil.java @@ -0,0 +1,191 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.common.util; + +import cn.hutool.core.util.ReflectUtil; +import lombok.val; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.dromara.dynamictp.common.entity.DtpExecutorProps; +import org.dromara.dynamictp.common.entity.TpExecutorProps; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; +import org.dromara.dynamictp.common.properties.DtpProperties; + +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import static org.dromara.dynamictp.common.constant.DynamicTpConst.AWARE_NAMES; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.EXECUTORS_CONFIG_PREFIX; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.GLOBAL_CONFIG_PREFIX; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.MAIN_PROPERTIES_PREFIX; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.NOTIFY_ITEMS; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.PLATFORM_IDS; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.PLUGIN_NAMES; + +/** + * DtpPropertiesBinderUtil related + * + * @author yanhom + * @since 1.1.9 + */ +@SuppressWarnings("unchecked") +public final class DtpPropertiesBinderUtil { + + private DtpPropertiesBinderUtil() { + } + + /** + * Assign global environment variable to property + * + * @param source environment + * @param dtpProperties dtpProperties + */ + public static void tryResetWithGlobalConfig(Object source, DtpProperties dtpProperties) { + if (Objects.isNull(dtpProperties.getGlobalExecutorProps())) { + return; + } + if (CollectionUtils.isNotEmpty(dtpProperties.getExecutors())) { + tryResetCusExecutors(dtpProperties, source); + } + tryResetAdapterExecutors(dtpProperties, source); + } + + private static void tryResetCusExecutors(DtpProperties dtpProperties, Object source) { + val dtpPropsFields = ReflectionUtil.getAllFields(DtpExecutorProps.class); + val globalExecutorProps = dtpProperties.getGlobalExecutorProps(); + int[] idx = {0}; + dtpProperties.getExecutors().forEach(executor -> { + dtpPropsFields.forEach(field -> { + String propKey = EXECUTORS_CONFIG_PREFIX + idx[0] + "]." + field.getName(); + setBasicField(source, field, executor, propKey); + }); + String executorFieldNamePrefix = EXECUTORS_CONFIG_PREFIX + idx[0] + "]"; + setCollectionField(source, globalExecutorProps, executor, executorFieldNamePrefix); + idx[0]++; + }); + } + + private static void tryResetAdapterExecutors(DtpProperties dtpProperties, Object source) { + val dtpPropertiesFields = ReflectionUtil.getAllFields(DtpProperties.class); + val tpExecutorPropFields = ReflectionUtil.getAllFields(TpExecutorProps.class); + val globalExecutorProps = dtpProperties.getGlobalExecutorProps(); + dtpPropertiesFields.forEach(dtpPropertiesField -> { + val candidateExecutor = ReflectUtil.getFieldValue(dtpProperties, dtpPropertiesField); + if (Objects.isNull(candidateExecutor)) { + return; + } + String candidateExecutorFieldName = dtpPropertiesField.getName(); + if (dtpPropertiesField.getType().isAssignableFrom(TpExecutorProps.class)) { + tpExecutorPropFields.forEach(field -> setBasicField(source, field, candidateExecutorFieldName, candidateExecutor)); + String executorFieldNamePrefix = MAIN_PROPERTIES_PREFIX + "." + dtpPropertiesField.getName(); + setCollectionField(source, globalExecutorProps, candidateExecutor, executorFieldNamePrefix); + } else if (dtpPropertiesField.getGenericType() instanceof ParameterizedType) { + ParameterizedType paramType = (ParameterizedType) dtpPropertiesField.getGenericType(); + Type[] argTypes = paramType.getActualTypeArguments(); + if (argTypes.length == 1 && argTypes[0].equals(TpExecutorProps.class)) { + List executors = (List) candidateExecutor; + if (CollectionUtils.isEmpty(executors)) { + return; + } + int[] idx = {0}; + executors.forEach(executor -> { + tpExecutorPropFields.forEach(field -> setBasicField(source, field, candidateExecutorFieldName, executor, idx)); + String executorFieldNamePrefix = MAIN_PROPERTIES_PREFIX + "." + candidateExecutorFieldName + "[" + idx[0] + "]"; + setCollectionField(source, globalExecutorProps, executor, executorFieldNamePrefix); + idx[0]++; + }); + } + } + }); + } + + private static Object getProperty(String key, Object environment) { + if (environment instanceof Map) { + Map properties = (Map) environment; + return properties.get(key); + } else { + return ContextManagerHelper.getEnvironmentProperty(key, environment); + } + } + + private static void setBasicField(Object source, Field field, String executorFieldName, Object executor, int[] idx) { + String propKey = MAIN_PROPERTIES_PREFIX + "." + executorFieldName + "[" + idx[0] + "]." + field.getName(); + setBasicField(source, field, executor, propKey); + } + + private static void setBasicField(Object source, Field field, String executorFieldName, Object executor) { + String propKey = MAIN_PROPERTIES_PREFIX + "." + executorFieldName + "." + field.getName(); + setBasicField(source, field, executor, propKey); + } + + private static void setBasicField(Object source, Field field, Object executor, String propKey) { + Object propVal = getProperty(propKey, source); + if (Objects.nonNull(propVal)) { + return; + } + Object globalFieldVal = getProperty(GLOBAL_CONFIG_PREFIX + field.getName(), source); + if (Objects.isNull(globalFieldVal)) { + return; + } + ReflectUtil.setFieldValue(executor, field.getName(), globalFieldVal); + } + + private static void setCollectionField(Object source, DtpExecutorProps globalExecutorProps, Object executor, String prefix) { + if (isNotContains(prefix + ".taskWrapperNames[0]", source) && + CollectionUtils.isNotEmpty(globalExecutorProps.getTaskWrapperNames())) { + ReflectUtil.setFieldValue(executor, "taskWrapperNames", globalExecutorProps.getTaskWrapperNames()); + } + if (isNotContains(prefix + ".platformIds[0]", source) && + CollectionUtils.isNotEmpty(globalExecutorProps.getPlatformIds())) { + ReflectUtil.setFieldValue(executor, PLATFORM_IDS, globalExecutorProps.getPlatformIds()); + } + if (isNotContains(prefix + ".notifyItems[0].type", source) && + CollectionUtils.isNotEmpty(globalExecutorProps.getNotifyItems())) { + ReflectUtil.setFieldValue(executor, NOTIFY_ITEMS, globalExecutorProps.getNotifyItems()); + } + if (isNotContains(prefix + ".awareNames[0]", source) && + CollectionUtils.isNotEmpty(globalExecutorProps.getAwareNames())) { + ReflectUtil.setFieldValue(executor, AWARE_NAMES, globalExecutorProps.getAwareNames()); + } + try { + if (isNotContains(prefix + ".pluginNames[0]", source) && + CollectionUtils.isNotEmpty(globalExecutorProps.getPluginNames())) { + ReflectUtil.setFieldValue(executor, PLUGIN_NAMES, globalExecutorProps.getPluginNames()); + } + } catch (Exception e) { + // ignore + } + } + + private static boolean isNotContains(String key, Object environment) { + return !contains(key, environment); + } + + private static boolean contains(String key, Object environment) { + if (environment instanceof Map) { + Map properties = (Map) environment; + return properties.containsKey(key); + } else { + return StringUtils.isNotBlank(ContextManagerHelper.getEnvironmentProperty(key, environment)); + } + } +} diff --git a/common/src/main/java/org/dromara/dynamictp/common/util/ExecutorUtil.java b/common/src/main/java/org/dromara/dynamictp/common/util/ExecutorUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..951de566809ca9ea1f93a212d89032095abe23ab --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/util/ExecutorUtil.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.common.util; + +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; + +import java.util.Objects; +import java.util.concurrent.FutureTask; + +import static org.dromara.dynamictp.common.constant.DynamicTpConst.TRACE_ID; + +/** + * ExecutorUtil related + * + * @author yanhom + * @since 1.1.9 + */ +@Slf4j +public final class ExecutorUtil { + + private ExecutorUtil() { + } + + public static void tryExecAfterExecute(Runnable r, Throwable t) { + tryPrintError(r, t); + tryClearContext(); + } + + private static void tryPrintError(Runnable r, Throwable t) { + if (Objects.nonNull(t)) { + log.error("DynamicTp execute, thread {} throw exception, traceId {}", + Thread.currentThread(), MDC.get(TRACE_ID), t); + return; + } + if (r instanceof FutureTask) { + try { + FutureTask future = (FutureTask) r; + if (future.isDone() && !future.isCancelled()) { + future.get(); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (Exception e) { + log.error("DynamicTp execute, thread {} throw exception, traceId {}", + Thread.currentThread(), MDC.get(TRACE_ID), e); + } + } + } + + public static void tryClearContext() { + MDC.remove(TRACE_ID); + } +} diff --git a/common/src/main/java/org/dromara/dynamictp/common/util/JsonUtil.java b/common/src/main/java/org/dromara/dynamictp/common/util/JsonUtil.java index eabbdc98e171eb83e7fad38800aae0d10ad140a1..0ab5b47a8f4db6905136983fd0da48d2322255d0 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/util/JsonUtil.java +++ b/common/src/main/java/org/dromara/dynamictp/common/util/JsonUtil.java @@ -46,9 +46,11 @@ public final class JsonUtil { try { JsonParser jsonParser = iterator.next(); if (jsonParser.supports()) { + log.info("Using JSON parser: {}", jsonParser.getClass().getName()); return jsonParser; } - } catch (Throwable ignored) { + } catch (Throwable e) { + log.error("Failed to load JSON parser", e); } } throw new IllegalStateException("No JSON parser found"); diff --git a/common/src/main/java/org/dromara/dynamictp/common/util/MethodUtil.java b/common/src/main/java/org/dromara/dynamictp/common/util/MethodUtil.java index 6721907cbf52f3560c021f3fb7f4796eeeb32489..e923f77813039b031c65f6e6f41a77c3a116b6c6 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/util/MethodUtil.java +++ b/common/src/main/java/org/dromara/dynamictp/common/util/MethodUtil.java @@ -58,4 +58,19 @@ public final class MethodUtil { return -1; } } + + /** + * Invoke method and return int value. + * + * @param method target method + * @param targetObj the object the underlying method is invoked from + * @return result + */ + public static int invokeAndReturnInt(Method method, Object targetObj) { + try { + return method != null ? (int) method.invoke(targetObj) : -1; + } catch (Exception e) { + return -1; + } + } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/util/ReflectionUtil.java b/common/src/main/java/org/dromara/dynamictp/common/util/ReflectionUtil.java index 520ddb666915764552594ff4b1f9982f7df212c9..295b29c7c74085172b0ce0bd454019760ddbe77d 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/util/ReflectionUtil.java +++ b/common/src/main/java/org/dromara/dynamictp/common/util/ReflectionUtil.java @@ -17,10 +17,14 @@ package org.dromara.dynamictp.common.util; +import lombok.extern.slf4j.Slf4j; import lombok.val; -import org.springframework.util.ReflectionUtils; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.commons.lang3.reflect.MethodUtils; import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.List; import java.util.Objects; /** @@ -29,6 +33,7 @@ import java.util.Objects; * @author yanhom * @since 1.0.6 */ +@Slf4j public final class ReflectionUtil { private ReflectionUtil() { } @@ -38,11 +43,12 @@ public final class ReflectionUtil { if (Objects.isNull(field)) { return null; } - val fieldObj = ReflectionUtils.getField(field, targetObj); - if (Objects.isNull(fieldObj)) { + try { + return FieldUtils.readField(field, targetObj, true); + } catch (IllegalAccessException e) { + log.error("Failed to read field '{}' from object '{}'", fieldName, targetObj, e); return null; } - return fieldObj; } public static Object getFieldValue(Class targetClass, String fieldName, Object targetObj) { @@ -50,37 +56,61 @@ public final class ReflectionUtil { if (Objects.isNull(field)) { return null; } - val fieldObj = ReflectionUtils.getField(field, targetObj); - if (Objects.isNull(fieldObj)) { + try { + return FieldUtils.readField(field, targetObj, true); + } catch (IllegalAccessException e) { + log.error("Failed to read field '{}' from object '{}'", fieldName, targetObj, e); return null; } - return fieldObj; } - public static void setFieldValue(String fieldName, Object targetObj, Object targetVal) - throws IllegalAccessException { - val field = getField(targetObj.getClass(), fieldName); - if (Objects.isNull(field)) { - return; - } - field.set(targetObj, targetVal); + public static boolean setFieldValue(String fieldName, Object targetObj, Object targetVal) { + return setFieldValue(targetObj.getClass(), fieldName, targetObj, targetVal); } - public static void setFieldValue(Class targetClass, String fieldName, Object targetObj, Object targetVal) - throws IllegalAccessException { + public static boolean setFieldValue(Class targetClass, String fieldName, Object targetObj, Object targetVal) { val field = getField(targetClass, fieldName); if (Objects.isNull(field)) { - return; + return false; + } + try { + FieldUtils.writeField(field, targetObj, targetVal, true); + return true; + } catch (IllegalAccessException e) { + log.error("Failed to write value '{}' to field '{}' in object '{}'", targetVal, fieldName, targetObj, e); + return false; + } + } + + public static boolean setFieldValue(Field field, Object targetObj, Object targetVal) { + try { + FieldUtils.writeField(field, targetObj, targetVal, true); + return true; + } catch (IllegalAccessException e) { + log.error("Failed to write value '{}' to field '{}' in object '{}'", targetVal, field.getName(), targetObj, e); + return false; } - field.set(targetObj, targetVal); } public static Field getField(Class targetClass, String fieldName) { - Field field = ReflectionUtils.findField(targetClass, fieldName); + Field field = FieldUtils.getField(targetClass, fieldName, true); if (Objects.isNull(field)) { + log.warn("Field '{}' not found in class '{}'", fieldName, targetClass.getName()); return null; } - ReflectionUtils.makeAccessible(field); return field; } + + public static Method findMethod(Class targetClass, String methodName, Class... parameterTypes) { + Method method = MethodUtils.getMatchingMethod(targetClass, methodName, parameterTypes); + if (Objects.isNull(method)) { + log.warn("Method '{}' with parameters '{}' not found in class '{}'", methodName, parameterTypes, targetClass.getName()); + return null; + } + return method; + } + + public static List getAllFields(Class targetClass) { + return FieldUtils.getAllFieldsList(targetClass); + } } diff --git a/common/src/main/java/org/dromara/dynamictp/common/util/StreamUtil.java b/common/src/main/java/org/dromara/dynamictp/common/util/StreamUtil.java index 084730ddadf1c9f562344186e2bdd15aa9004a6d..b53d05e9e201d33fabeb21e9a972097717943844 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/util/StreamUtil.java +++ b/common/src/main/java/org/dromara/dynamictp/common/util/StreamUtil.java @@ -17,8 +17,8 @@ package org.dromara.dynamictp.common.util; +import com.google.common.base.Preconditions; import org.apache.commons.collections4.CollectionUtils; -import org.springframework.util.Assert; import java.util.Collection; import java.util.Collections; @@ -48,7 +48,7 @@ public final class StreamUtil { */ public static List fetchProperty(Collection data, Function mapping) { - Assert.notNull(mapping, "mapping function must not be null"); + Preconditions.checkNotNull(mapping, "mapping function must not be null"); if (CollectionUtils.isEmpty(data)) { return Collections.emptyList(); } @@ -65,7 +65,7 @@ public final class StreamUtil { * @return a map which key from list data and value is data */ public static Map toMap(Collection

coll, Function key) { - Assert.notNull(key, "key function must not be null"); + Preconditions.checkNotNull(key, "key function must not be null"); if (CollectionUtils.isEmpty(coll)) { return Collections.emptyMap(); } @@ -87,8 +87,8 @@ public final class StreamUtil { public static Map toMap(Collection list, Function key, Function value) { - Assert.notNull(key, "Key function must not be null"); - Assert.notNull(value, "Value function must not be null"); + Preconditions.checkNotNull(key, "Key function must not be null"); + Preconditions.checkNotNull(value, "Value function must not be null"); if (CollectionUtils.isEmpty(list)) { return Collections.emptyMap(); } @@ -108,7 +108,7 @@ public final class StreamUtil { public static Map> toListMap(Collection ids, Collection list, Function key) { - Assert.notNull(key, "mapping function must not be null"); + Preconditions.checkNotNull(key, "mapping function must not be null"); if (CollectionUtils.isEmpty(ids) || CollectionUtils.isEmpty(list)) { return Collections.emptyMap(); } diff --git a/common/src/main/java/org/dromara/dynamictp/common/util/UUIDUtil.java b/common/src/main/java/org/dromara/dynamictp/common/util/UUIDUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..4fbdb538d175f79862dd60aff37043991c409983 --- /dev/null +++ b/common/src/main/java/org/dromara/dynamictp/common/util/UUIDUtil.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.common.util; + +import java.util.UUID; + +/** + * UUID util. + * + * @author yanhom + */ +public class UUIDUtil { + + private UUIDUtil() { } + + public static String genUuid() { + return UUID.randomUUID().toString(); + } + + public static String genUuid(int length) { + return genUuid().replace("-", "").substring(0, length); + } +} diff --git a/core/pom.xml b/core/pom.xml index 849f112b272ae9a1b4019204eb3c0f5eb733975c..c2c0a99d3657f84c91635d4afd44ca23362a44c2 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-all - ${revision} + 1.2.1 ../pom.xml dynamic-tp-core @@ -37,16 +37,6 @@ transmittable-thread-local - - com.fasterxml.jackson.core - jackson-core - - - - com.fasterxml.jackson.core - jackson-databind - - cn.hutool hutool-core @@ -56,6 +46,12 @@ io.dropwizard.metrics metrics-core + + + com.alibaba + transmittable-thread-local + 2.14.3 + diff --git a/core/src/main/java/org/dromara/dynamictp/core/DtpRegistry.java b/core/src/main/java/org/dromara/dynamictp/core/DtpRegistry.java index 8b18081dae7bfc58f01bdd82876430d0bf15aab3..7b0fcad33eb55b4fcfe33423a3e5957ad977c109 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/DtpRegistry.java +++ b/core/src/main/java/org/dromara/dynamictp/core/DtpRegistry.java @@ -21,39 +21,44 @@ import com.github.dadiyang.equator.Equator; import com.github.dadiyang.equator.FieldInfo; import com.github.dadiyang.equator.GetterBaseEquator; import com.google.common.collect.Sets; +import com.google.common.eventbus.Subscribe; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.dromara.dynamictp.common.entity.DtpExecutorProps; import org.dromara.dynamictp.common.entity.TpMainFields; +import org.dromara.dynamictp.common.event.CustomContextRefreshedEvent; import org.dromara.dynamictp.common.ex.DtpException; +import org.dromara.dynamictp.common.manager.EventBusManager; import org.dromara.dynamictp.common.properties.DtpProperties; import org.dromara.dynamictp.common.queue.MemorySafeLinkedBlockingQueue; import org.dromara.dynamictp.common.queue.VariableLinkedBlockingQueue; -import org.dromara.dynamictp.common.spring.OnceApplicationContextEventListener; import org.dromara.dynamictp.common.util.StreamUtil; import org.dromara.dynamictp.core.aware.AwareManager; import org.dromara.dynamictp.core.converter.ExecutorConverter; import org.dromara.dynamictp.core.executor.DtpExecutor; +import org.dromara.dynamictp.core.executor.NamedThreadFactory; import org.dromara.dynamictp.core.notifier.manager.NoticeManager; import org.dromara.dynamictp.core.notifier.manager.NotifyHelper; import org.dromara.dynamictp.core.reject.RejectHandlerGetter; -import org.dromara.dynamictp.core.support.ExecutorAdapter; import org.dromara.dynamictp.core.support.ExecutorWrapper; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import org.dromara.dynamictp.core.support.task.wrapper.TaskWrapper; import org.dromara.dynamictp.core.support.task.wrapper.TaskWrappers; -import org.springframework.context.event.ContextRefreshedEvent; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.stream.Collectors; +import static java.util.stream.Collectors.toList; import static org.dromara.dynamictp.common.constant.DynamicTpConst.M_1; import static org.dromara.dynamictp.common.constant.DynamicTpConst.PROPERTIES_CHANGE_SHOW_STYLE; @@ -64,7 +69,7 @@ import static org.dromara.dynamictp.common.constant.DynamicTpConst.PROPERTIES_CH * @since 1.0.0 **/ @Slf4j -public class DtpRegistry extends OnceApplicationContextEventListener { +public class DtpRegistry { /** * Maintain all automatically registered and manually registered Executors. @@ -80,6 +85,7 @@ public class DtpRegistry extends OnceApplicationContextEventListener { public DtpRegistry(DtpProperties dtpProperties) { DtpRegistry.dtpProperties = dtpProperties; + EventBusManager.register(this); } /** @@ -111,6 +117,18 @@ public class DtpRegistry extends OnceApplicationContextEventListener { EXECUTOR_REGISTRY.putIfAbsent(wrapper.getThreadPoolName(), wrapper); } + /** + * Unregister a executor. + * + * @param name thread pool name + * @return the managed DtpExecutor instance + */ + public static ExecutorWrapper unregisterExecutor(String name) { + ExecutorWrapper executorWrapper = getExecutorWrapper(name); + log.info("DynamicTp unregister executor: {}", executorWrapper); + return EXECUTOR_REGISTRY.remove(name); + } + /** * Get DtpExecutor by thread pool name. * @@ -166,24 +184,26 @@ public class DtpRegistry extends OnceApplicationContextEventListener { log.debug("DynamicTp refresh, empty thread pool properties."); return; } - dtpProperties.getExecutors().forEach(p -> { - if (StringUtils.isBlank(p.getThreadPoolName())) { - log.warn("DynamicTp refresh, thread pool name must not be blank, executorProps: {}", p); - return; - } - ExecutorWrapper executorWrapper = EXECUTOR_REGISTRY.get(p.getThreadPoolName()); - if (Objects.nonNull(executorWrapper)) { - refresh(executorWrapper, p); - return; - } - log.warn("DynamicTp refresh, cannot find specified executor, name: {}.", p.getThreadPoolName()); - }); + dtpProperties.getExecutors().forEach(DtpRegistry::refresh); + } + + public static void refresh(DtpExecutorProps props) { + if (Objects.isNull(props) || StringUtils.isBlank(props.getThreadPoolName())) { + log.warn("DynamicTp refresh, thread pool name must not be blank, executorProps: {}", props); + return; + } + ExecutorWrapper executorWrapper = EXECUTOR_REGISTRY.get(props.getThreadPoolName()); + if (Objects.nonNull(executorWrapper)) { + refresh(executorWrapper, props); + return; + } + log.warn("DynamicTp refresh, cannot find specified executor, name: {}.", props.getThreadPoolName()); } private static void refresh(ExecutorWrapper executorWrapper, DtpExecutorProps props) { if (props.coreParamIsInValid()) { log.error("DynamicTp refresh, invalid parameters exist, properties: {}", props); - throw new IllegalArgumentException("DynamicTp refresh, invalid parameters exist, properties: " + props); + return; } TpMainFields oldFields = ExecutorConverter.toMainFields(executorWrapper); doRefresh(executorWrapper, props); @@ -240,8 +260,9 @@ public class DtpRegistry extends OnceApplicationContextEventListener { String currentRejectHandlerType = executor.getRejectHandlerType(); if (!Objects.equals(currentRejectHandlerType, props.getRejectedHandlerType())) { val rejectHandler = RejectHandlerGetter.buildRejectedHandler(props.getRejectedHandlerType()); - executor.setRejectedExecutionHandler(rejectHandler); + executorWrapper.setRejectHandler(rejectHandler); } + List taskWrappers = TaskWrappers.getInstance().getByNames(props.getTaskWrapperNames()); executorWrapper.setTaskWrappers(taskWrappers); @@ -249,6 +270,7 @@ public class DtpRegistry extends OnceApplicationContextEventListener { NotifyHelper.updateNotifyInfo(executorWrapper, props, dtpProperties.getPlatforms()); // update aware related AwareManager.refresh(executorWrapper, props); + updateWrapper(executorWrapper, props); } private static void doRefreshDtp(ExecutorWrapper executorWrapper, DtpExecutorProps props) { @@ -257,14 +279,29 @@ public class DtpRegistry extends OnceApplicationContextEventListener { if (StringUtils.isNotBlank(props.getThreadPoolAliasName())) { executor.setThreadPoolAliasName(props.getThreadPoolAliasName()); } + executor.setPreStartAllCoreThreads(props.isPreStartAllCoreThreads()); + if (executor.getThreadFactory() instanceof NamedThreadFactory) { + String prefix = ((NamedThreadFactory) executor.getThreadFactory()).getNamePrefix(); + if (!Objects.equals(prefix, props.getThreadNamePrefix())) { + ((NamedThreadFactory) executor.getThreadFactory()).setNamePrefix(props.getThreadNamePrefix()); + } + } + // update reject handler executor.setRejectEnhanced(props.isRejectEnhanced()); if (!Objects.equals(executor.getRejectHandlerType(), props.getRejectedHandlerType())) { executor.setRejectHandler(RejectHandlerGetter.buildRejectedHandler(props.getRejectedHandlerType())); } + + // update timeout related + executor.setRunTimeout(props.getRunTimeout()); + executor.setQueueTimeout(props.getQueueTimeout()); + executor.setTryInterrupt(props.isTryInterrupt()); + + // update shutdown related executor.setWaitForTasksToCompleteOnShutdown(props.isWaitForTasksToCompleteOnShutdown()); executor.setAwaitTerminationSeconds(props.getAwaitTerminationSeconds()); - executor.setPreStartAllCoreThreads(props.isPreStartAllCoreThreads()); + List taskWrappers = TaskWrappers.getInstance().getByNames(props.getTaskWrapperNames()); executor.setTaskWrappers(taskWrappers); @@ -272,14 +309,19 @@ public class DtpRegistry extends OnceApplicationContextEventListener { NotifyHelper.updateNotifyInfo(executor, props, dtpProperties.getPlatforms()); // update aware related AwareManager.refresh(executorWrapper, props); - updateWrapper(executorWrapper, executor); + updateWrapper(executorWrapper, props); } - private static void updateWrapper(ExecutorWrapper executorWrapper, DtpExecutor executor) { - executorWrapper.setThreadPoolAliasName(executor.getThreadPoolAliasName()); - executorWrapper.setNotifyItems(executor.getNotifyItems()); - executorWrapper.setPlatformIds(executor.getPlatformIds()); - executorWrapper.setNotifyEnabled(executor.isNotifyEnabled()); + private static void updateWrapper(ExecutorWrapper executorWrapper, DtpExecutorProps props) { + if (executorWrapper.isDtpExecutor()) { + executorWrapper.setThreadPoolAliasName(props.getThreadPoolAliasName()); + executorWrapper.setNotifyItems(((DtpExecutor) executorWrapper.getExecutor()).getNotifyItems()); + executorWrapper.setPlatformIds(props.getPlatformIds()); + executorWrapper.setNotifyEnabled(props.isNotifyEnabled()); + } + executorWrapper.setRejectEnhanced(props.isRejectEnhanced()); + executorWrapper.setWaitForTasksToCompleteOnShutdown(props.isWaitForTasksToCompleteOnShutdown()); + executorWrapper.setAwaitTerminationSeconds(props.getAwaitTerminationSeconds()); } /** @@ -327,16 +369,23 @@ public class DtpRegistry extends OnceApplicationContextEventListener { props.getThreadPoolName(), blockingQueue.getClass().getSimpleName()); } - @Override - protected void onContextRefreshedEvent(ContextRefreshedEvent event) { - Set remoteExecutors = Collections.emptySet(); - if (CollectionUtils.isNotEmpty(dtpProperties.getExecutors())) { - remoteExecutors = dtpProperties.getExecutors().stream() + @Subscribe + public void onContextRefreshedEvent(CustomContextRefreshedEvent event) { + val executors = Optional.ofNullable(dtpProperties.getExecutors()).orElse(Collections.emptyList()); + val registeredExecutors = Sets.newHashSet(EXECUTOR_REGISTRY.keySet()); + Collection remoteExecutors = Collections.emptySet(); + if (CollectionUtils.isNotEmpty(executors)) { + remoteExecutors = CollectionUtils.intersection(executors.stream() .map(DtpExecutorProps::getThreadPoolName) - .collect(Collectors.toSet()); + .collect(Collectors.toSet()), registeredExecutors); } - val registeredExecutors = Sets.newHashSet(EXECUTOR_REGISTRY.keySet()); val localExecutors = CollectionUtils.subtract(registeredExecutors, remoteExecutors); + + // refresh just for non-dtp executors + val nonDtpExecutors = executors.stream().filter(e -> !e.isAutoCreate()).collect(toList()); + if (CollectionUtils.isNotEmpty(nonDtpExecutors)) { + nonDtpExecutors.forEach(DtpRegistry::refresh); + } log.info("DtpRegistry has been initialized, remote executors: {}, local executors: {}", remoteExecutors, localExecutors); } diff --git a/core/src/main/java/org/dromara/dynamictp/core/aware/RejectHandlerAware.java b/core/src/main/java/org/dromara/dynamictp/core/aware/RejectHandlerAware.java index 5766f5b9b338bd7bb1d0037455de769d0f2ceba4..027da044f67af4679f02e397ef8b557f82febec3 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/aware/RejectHandlerAware.java +++ b/core/src/main/java/org/dromara/dynamictp/core/aware/RejectHandlerAware.java @@ -31,4 +31,13 @@ public interface RejectHandlerAware extends DtpAware { * @return reject handler type */ String getRejectHandlerType(); + + /** + * Set reject handler type. + * + * @param rejectHandlerType reject handler type + */ + default void setRejectHandlerType(String rejectHandlerType) { + + } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/aware/TaskRejectAware.java b/core/src/main/java/org/dromara/dynamictp/core/aware/TaskRejectAware.java index d7c18b12d6b60df47bd846550b24f55a10b9fc9e..69816240e5e293732114f15af7af68e5780126f7 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/aware/TaskRejectAware.java +++ b/core/src/main/java/org/dromara/dynamictp/core/aware/TaskRejectAware.java @@ -20,7 +20,7 @@ package org.dromara.dynamictp.core.aware; import cn.hutool.core.text.CharSequenceUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.core.notifier.manager.AlarmManager; -import org.dromara.dynamictp.core.support.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import org.dromara.dynamictp.core.support.ThreadPoolStatProvider; import org.slf4j.MDC; @@ -28,7 +28,7 @@ import java.util.Objects; import java.util.concurrent.Executor; import static org.dromara.dynamictp.common.constant.DynamicTpConst.TRACE_ID; -import static org.dromara.dynamictp.common.em.NotifyItemEnum.REJECT; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.REJECT; /** * TaskRejectAware related diff --git a/core/src/main/java/org/dromara/dynamictp/core/converter/ExecutorConverter.java b/core/src/main/java/org/dromara/dynamictp/core/converter/ExecutorConverter.java index 48d3333218c34f1c144593ade56d5f232efc7a3d..3688755f1fb3f943f55e325d97c77ba00dca6271 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/converter/ExecutorConverter.java +++ b/core/src/main/java/org/dromara/dynamictp/core/converter/ExecutorConverter.java @@ -22,7 +22,7 @@ import org.dromara.dynamictp.common.entity.ThreadPoolStats; import org.dromara.dynamictp.common.entity.TpMainFields; import org.dromara.dynamictp.core.executor.DtpExecutor; import org.dromara.dynamictp.core.monitor.PerformanceProvider; -import org.dromara.dynamictp.core.support.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import org.dromara.dynamictp.core.support.ExecutorWrapper; import org.dromara.dynamictp.core.support.ThreadPoolStatProvider; diff --git a/core/src/main/java/org/dromara/dynamictp/core/executor/DtpExecutor.java b/core/src/main/java/org/dromara/dynamictp/core/executor/DtpExecutor.java index 27b63253112fca04bb1e97bd96fcb2956e1e3894..e9b3474fbd965d2b71b444ab78aa0b47cbc9c948 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/executor/DtpExecutor.java +++ b/core/src/main/java/org/dromara/dynamictp/core/executor/DtpExecutor.java @@ -21,31 +21,24 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import lombok.val; -import org.dromara.dynamictp.common.em.NotifyItemEnum; import org.dromara.dynamictp.common.entity.NotifyItem; +import org.dromara.dynamictp.common.util.ExecutorUtil; import org.dromara.dynamictp.core.aware.AwareManager; import org.dromara.dynamictp.core.aware.TaskEnhanceAware; import org.dromara.dynamictp.core.notifier.manager.NotifyHelper; import org.dromara.dynamictp.core.reject.RejectHandlerGetter; -import org.dromara.dynamictp.core.spring.SpringExecutor; -import org.dromara.dynamictp.core.support.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import org.dromara.dynamictp.core.support.task.wrapper.TaskWrapper; -import org.slf4j.MDC; - +import org.dromara.dynamictp.common.notifier.type.NotifyItemTypeRegistry; import java.util.List; -import java.util.Objects; import java.util.Set; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.FutureTask; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.TRACE_ID; - /** * Dynamic ThreadPoolExecutor, extending ThreadPoolExecutor, implements some new features * @@ -53,8 +46,7 @@ import static org.dromara.dynamictp.common.constant.DynamicTpConst.TRACE_ID; * @since 1.0.0 **/ @Slf4j -public class DtpExecutor extends ThreadPoolExecutor - implements SpringExecutor, TaskEnhanceAware, ExecutorAdapter { +public class DtpExecutor extends ThreadPoolExecutor implements TaskEnhanceAware, ExecutorAdapter { /** * The name of the thread pool. @@ -72,7 +64,7 @@ public class DtpExecutor extends ThreadPoolExecutor private boolean notifyEnabled = true; /** - * Notify items, see {@link NotifyItemEnum}. + * Notify items, see {@link NotifyItemTypeRegistry}. */ private List notifyItems; @@ -182,11 +174,6 @@ public class DtpExecutor extends ThreadPoolExecutor public ThreadPoolExecutor getOriginal() { return this; } - - @Override - public void execute(Runnable task, long startTimeout) { - execute(task); - } @Override public void execute(Runnable command) { @@ -197,16 +184,15 @@ public class DtpExecutor extends ThreadPoolExecutor @Override protected void beforeExecute(Thread t, Runnable r) { - super.beforeExecute(t, r); AwareManager.beforeExecute(this, t, r); + super.beforeExecute(t, r); } @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); AwareManager.afterExecute(this, r, t); - tryPrintError(r, t); - clearContext(); + ExecutorUtil.tryExecAfterExecute(r, t); } @Override @@ -246,29 +232,6 @@ public class DtpExecutor extends ThreadPoolExecutor setRejectedExecutionHandler(RejectHandlerGetter.getProxy(handler)); } - private void tryPrintError(Runnable r, Throwable t) { - if (Objects.nonNull(t)) { - log.error("DynamicTp execute, thread {} throw exception, traceId {}", - Thread.currentThread(), MDC.get(TRACE_ID), t); - return; - } - if (r instanceof FutureTask) { - try { - Future future = (Future) r; - future.get(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } catch (Exception e) { - log.error("DynamicTp execute, thread {} throw exception, traceId {}", - Thread.currentThread(), MDC.get(TRACE_ID), e); - } - } - } - - private void clearContext() { - MDC.remove(TRACE_ID); - } - public String getThreadPoolName() { return threadPoolName; } diff --git a/core/src/main/java/org/dromara/dynamictp/core/executor/NamedThreadFactory.java b/core/src/main/java/org/dromara/dynamictp/core/executor/NamedThreadFactory.java index d5b8c581544228ec4621f1134708591ed39b0e60..b101a821e0b26ad9a3ac2c944a72437420e33195 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/executor/NamedThreadFactory.java +++ b/core/src/main/java/org/dromara/dynamictp/core/executor/NamedThreadFactory.java @@ -31,9 +31,9 @@ import java.util.concurrent.atomic.AtomicInteger; @Slf4j public class NamedThreadFactory implements ThreadFactory { - private final ThreadGroup group; + private String namePrefix; - private final String namePrefix; + private final ThreadGroup group; /** * is daemon thread. @@ -78,4 +78,8 @@ public class NamedThreadFactory implements ThreadFactory { public String getNamePrefix() { return namePrefix; } + + public void setNamePrefix(String namePrefix) { + this.namePrefix = namePrefix; + } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/executor/ScheduledDtpExecutor.java b/core/src/main/java/org/dromara/dynamictp/core/executor/ScheduledDtpExecutor.java index 25c832768977d1077aedbe00a60989f8e0913506..835053114e65bdfc0137f2e47b112549ebd9fc3c 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/executor/ScheduledDtpExecutor.java +++ b/core/src/main/java/org/dromara/dynamictp/core/executor/ScheduledDtpExecutor.java @@ -18,13 +18,13 @@ package org.dromara.dynamictp.core.executor; import org.dromara.dynamictp.common.em.JreEnum; -import org.dromara.dynamictp.core.support.ScheduledThreadPoolExecutorProxy; +import org.dromara.dynamictp.core.support.proxy.ScheduledThreadPoolExecutorProxy; + import java.util.Collection; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ScheduledExecutorService; @@ -34,7 +34,6 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; - import static java.util.concurrent.TimeUnit.NANOSECONDS; /** @@ -44,7 +43,7 @@ import static java.util.concurrent.TimeUnit.NANOSECONDS; **/ public class ScheduledDtpExecutor extends DtpExecutor implements ScheduledExecutorService { - private final ScheduledThreadPoolExecutor delegate; + private final ScheduledThreadPoolExecutorProxy delegate; public ScheduledDtpExecutor(int corePoolSize, int maximumPoolSize, @@ -60,6 +59,7 @@ public class ScheduledDtpExecutor extends DtpExecutor implements ScheduledExecut corePoolSize = corePoolSize == 0 ? 1 : corePoolSize; } delegate = new ScheduledThreadPoolExecutorProxy(new ScheduledThreadPoolExecutor(corePoolSize, threadFactory, handler)); + delegate.setTaskWrappers(getTaskWrappers()); } @Override @@ -94,7 +94,7 @@ public class ScheduledDtpExecutor extends DtpExecutor implements ScheduledExecut @Override public Future submit(Runnable task, T result) { - return schedule(Executors.callable(task, result), 0, NANOSECONDS); + return delegate.schedule(task, result, 0, NANOSECONDS); } @Override @@ -270,5 +270,3 @@ public class ScheduledDtpExecutor extends DtpExecutor implements ScheduledExecut return delegate; } } - - diff --git a/core/src/main/java/org/dromara/dynamictp/core/executor/eager/EagerDtpExecutor.java b/core/src/main/java/org/dromara/dynamictp/core/executor/eager/EagerDtpExecutor.java index 137f1042f29bd5b6d206de6907f721de42cb3fd2..f05671b99e61ed3539be0431c004b9c13b21800b 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/executor/eager/EagerDtpExecutor.java +++ b/core/src/main/java/org/dromara/dynamictp/core/executor/eager/EagerDtpExecutor.java @@ -85,12 +85,6 @@ public class EagerDtpExecutor extends DtpExecutor { return submittedTaskCount.get(); } - @Override - protected void afterExecute(Runnable r, Throwable t) { - submittedTaskCount.decrementAndGet(); - super.afterExecute(r, t); - } - @Override public void execute(Runnable command) { if (command == null) { @@ -121,4 +115,10 @@ public class EagerDtpExecutor extends DtpExecutor { } } } + + @Override + protected void afterExecute(Runnable r, Throwable t) { + submittedTaskCount.decrementAndGet(); + super.afterExecute(r, t); + } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/executor/eager/TaskQueue.java b/core/src/main/java/org/dromara/dynamictp/core/executor/eager/TaskQueue.java index 9dd3331d2f85281ac324e0c91afc5cf9a2ffdfbc..d2b320042492030d8427de369095d4a78e825ab7 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/executor/eager/TaskQueue.java +++ b/core/src/main/java/org/dromara/dynamictp/core/executor/eager/TaskQueue.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.core.executor.eager; import org.dromara.dynamictp.common.queue.VariableLinkedBlockingQueue; -import org.springframework.lang.NonNull; +import lombok.NonNull; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.TimeUnit; @@ -49,16 +49,15 @@ public class TaskQueue extends VariableLinkedBlockingQueue { if (executor == null) { throw new RejectedExecutionException("The task queue does not have executor."); } - int currentPoolThreadSize = executor.getPoolSize(); - if (currentPoolThreadSize == executor.getMaximumPoolSize()) { + if (executor.getPoolSize() == executor.getMaximumPoolSize()) { return super.offer(runnable); } // have free worker. put task into queue to let the worker deal with task. - if (executor.getSubmittedTaskCount() < currentPoolThreadSize) { + if (executor.getSubmittedTaskCount() <= executor.getPoolSize()) { return super.offer(runnable); } // return false to let executor create new worker. - if (currentPoolThreadSize < executor.getMaximumPoolSize()) { + if (executor.getPoolSize() < executor.getMaximumPoolSize()) { return false; } // currentPoolThreadSize >= max diff --git a/core/src/main/java/org/dromara/dynamictp/core/handler/CollectorHandler.java b/core/src/main/java/org/dromara/dynamictp/core/handler/CollectorHandler.java index 8275a3bc0812005c54ed9dd03f99a25690376ee7..3add7edc57369058f478edffc842ecd1c1b1b716 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/handler/CollectorHandler.java +++ b/core/src/main/java/org/dromara/dynamictp/core/handler/CollectorHandler.java @@ -26,7 +26,7 @@ import org.dromara.dynamictp.core.monitor.collector.LogCollector; import org.dromara.dynamictp.core.monitor.collector.MetricsCollector; import org.dromara.dynamictp.core.monitor.collector.MicroMeterCollector; import org.dromara.dynamictp.core.monitor.collector.jmx.JMXCollector; -import org.springframework.util.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import java.util.List; import java.util.Map; @@ -44,7 +44,7 @@ public final class CollectorHandler { private CollectorHandler() { List loadedCollectors = ExtensionServiceLoader.get(MetricsCollector.class); - loadedCollectors.forEach(collector -> COLLECTORS.put(collector.type(), collector)); + loadedCollectors.forEach(collector -> COLLECTORS.put(collector.type().toLowerCase(), collector)); MetricsCollector microMeterCollector = new MicroMeterCollector(); LogCollector logCollector = new LogCollector(); diff --git a/core/src/main/java/org/dromara/dynamictp/core/handler/NotifierHandler.java b/core/src/main/java/org/dromara/dynamictp/core/handler/NotifierHandler.java index 4b6f73ce75883a1c1f601d3fd0a75339ad37bcd7..7540d8b8a6a1cc29bba03e5bef3ae7b9644e4370 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/handler/NotifierHandler.java +++ b/core/src/main/java/org/dromara/dynamictp/core/handler/NotifierHandler.java @@ -17,10 +17,12 @@ package org.dromara.dynamictp.core.handler; +import cn.hutool.core.collection.CollUtil; import lombok.extern.slf4j.Slf4j; -import org.dromara.dynamictp.common.em.NotifyItemEnum; import org.dromara.dynamictp.common.entity.NotifyItem; +import org.dromara.dynamictp.common.entity.NotifyPlatform; import org.dromara.dynamictp.common.entity.TpMainFields; +import org.dromara.dynamictp.common.notifier.type.CommonNotifyItemType; import org.dromara.dynamictp.common.util.ExtensionServiceLoader; import org.dromara.dynamictp.core.notifier.DtpDingNotifier; import org.dromara.dynamictp.core.notifier.DtpLarkNotifier; @@ -29,6 +31,8 @@ import org.dromara.dynamictp.core.notifier.DtpWechatNotifier; import org.dromara.dynamictp.common.notifier.DingNotifier; import org.dromara.dynamictp.common.notifier.LarkNotifier; import org.dromara.dynamictp.common.notifier.WechatNotifier; +import org.dromara.dynamictp.core.notifier.context.BaseNotifyCtx; +import org.dromara.dynamictp.core.notifier.context.CustomAlarmCtx; import org.dromara.dynamictp.core.notifier.context.DtpNotifyCtxHolder; import org.dromara.dynamictp.core.notifier.manager.NotifyHelper; @@ -36,6 +40,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static org.dromara.dynamictp.common.em.NotifyItemTypeGroupEnum.CUSTOM; + /** * NotifierHandler related * @@ -49,7 +55,7 @@ public final class NotifierHandler { private NotifierHandler() { List loadedNotifiers = ExtensionServiceLoader.get(DtpNotifier.class); - loadedNotifiers.forEach(notifier -> NOTIFIERS.put(notifier.platform(), notifier)); + loadedNotifiers.forEach(notifier -> NOTIFIERS.put(notifier.platform().toLowerCase(), notifier)); DtpNotifier dingNotifier = new DtpDingNotifier(new DingNotifier()); DtpNotifier wechatNotifier = new DtpWechatNotifier(new WechatNotifier()); @@ -71,18 +77,28 @@ public final class NotifierHandler { } } - public void sendAlarm(NotifyItemEnum notifyItemEnum) { + public void sendAlarm(CommonNotifyItemType notifyItemType) { NotifyItem notifyItem = DtpNotifyCtxHolder.get().getNotifyItem(); + boolean customFlag = CollUtil.contains(notifyItemType.getGroupEnums(), CUSTOM); for (String platformId : notifyItem.getPlatformIds()) { NotifyHelper.getPlatform(platformId).ifPresent(p -> { DtpNotifier notifier = NOTIFIERS.get(p.getPlatform().toLowerCase()); if (notifier != null) { - notifier.sendAlarmMsg(p, notifyItemEnum); + doSendAlarmMsg(customFlag, notifier, p, notifyItemType); } }); } } + private void doSendAlarmMsg(boolean isCustom, DtpNotifier notifier, NotifyPlatform platform, CommonNotifyItemType notifyItemType) { + if (isCustom) { + CustomAlarmCtx context = (CustomAlarmCtx) DtpNotifyCtxHolder.get(); + notifier.sendCustomAlarmMsg(platform, notifyItemType, context.getCustomAlarmParam()); + } else { + notifier.sendAlarmMsg(platform, notifyItemType); + } + } + public static NotifierHandler getInstance() { return NotifierHandlerHolder.INSTANCE; } diff --git a/core/src/main/java/org/dromara/dynamictp/core/spring/DtpLifecycle.java b/core/src/main/java/org/dromara/dynamictp/core/lifecycle/DtpLifecycle.java similarity index 82% rename from core/src/main/java/org/dromara/dynamictp/core/spring/DtpLifecycle.java rename to core/src/main/java/org/dromara/dynamictp/core/lifecycle/DtpLifecycle.java index 3a6af1bd951b73727164a365a50ed6712937693e..d6e0a0f0f1ba276ed903a3702c34fe5328f98801 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/spring/DtpLifecycle.java +++ b/core/src/main/java/org/dromara/dynamictp/core/lifecycle/DtpLifecycle.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.spring; +package org.dromara.dynamictp.core.lifecycle; import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.common.manager.EventBusManager; import org.dromara.dynamictp.core.DtpRegistry; import org.dromara.dynamictp.core.monitor.DtpMonitor; import org.dromara.dynamictp.core.notifier.manager.AlarmManager; import org.dromara.dynamictp.core.notifier.manager.NoticeManager; import org.dromara.dynamictp.core.support.DtpLifecycleSupport; import org.dromara.dynamictp.core.system.SystemMetricManager; -import org.springframework.context.SmartLifecycle; import java.util.concurrent.atomic.AtomicBoolean; @@ -35,7 +35,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * @since 1.1.3 **/ @Slf4j -public class DtpLifecycle implements SmartLifecycle { +public class DtpLifecycle implements LifeCycleManagement { private final AtomicBoolean running = new AtomicBoolean(false); @@ -59,41 +59,28 @@ public class DtpLifecycle implements SmartLifecycle { return this.running.get(); } - /** - * Compatible with lower versions of spring. - * - * @param callback callback - */ @Override public void stop(Runnable callback) { stop(); callback.run(); } - /** - * Compatible with lower versions of spring. - * - * @return isAutoStartup - */ @Override public boolean isAutoStartup() { return true; } - /** - * Compatible with lower versions of spring. - * - * @return phase - */ @Override public int getPhase() { return Integer.MAX_VALUE; } + @Override public void shutdownInternal() { DtpMonitor.destroy(); AlarmManager.destroy(); NoticeManager.destroy(); - SystemMetricManager.stop(); + SystemMetricManager.destroy(); + EventBusManager.destroy(); } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/lifecycle/LifeCycleManagement.java b/core/src/main/java/org/dromara/dynamictp/core/lifecycle/LifeCycleManagement.java new file mode 100644 index 0000000000000000000000000000000000000000..349625dddfce84b7ba3737ee820b98f1b43bcb85 --- /dev/null +++ b/core/src/main/java/org/dromara/dynamictp/core/lifecycle/LifeCycleManagement.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.core.lifecycle; + +/** + * Interface for managing the lifecycle of a component. + * Provides methods to start, stop, and check the running state of a component, + * as well as handling auto startup and shutdown phases. + * + * @author vzer200 + * @since 1.2.0 + */ +public interface LifeCycleManagement { + + /** + * Starts the component. + */ + void start(); + + /** + * Stops the component. + */ + void stop(); + + /** + * Checks if the component is running. + * + * @return true if the component is running, false otherwise + */ + boolean isRunning(); + + /** + * Stops the component with a callback. + * + * @param callback the callback to execute after stopping + */ + void stop(Runnable callback); + + /** + * Checks if the component is set to auto startup. + * + * @return true if the component is set to auto startup, false otherwise + */ + boolean isAutoStartup(); + + /** + * Gets the phase of the component. + * + * @return the phase of the component + */ + int getPhase(); + + /** + * Performs internal shutdown operations. + */ + void shutdownInternal(); +} diff --git a/core/src/main/java/org/dromara/dynamictp/core/monitor/DtpMonitor.java b/core/src/main/java/org/dromara/dynamictp/core/monitor/DtpMonitor.java index 1a07c0af724a8f54a0e813b95afb089c0ecad3c6..88f7ce8089700d660ac1c39c5860aa4cb9fa2711 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/monitor/DtpMonitor.java +++ b/core/src/main/java/org/dromara/dynamictp/core/monitor/DtpMonitor.java @@ -17,27 +17,27 @@ package org.dromara.dynamictp.core.monitor; +import com.google.common.eventbus.Subscribe; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.entity.ThreadPoolStats; import org.dromara.dynamictp.common.event.AlarmCheckEvent; import org.dromara.dynamictp.common.event.CollectEvent; +import org.dromara.dynamictp.common.event.CustomContextRefreshedEvent; +import org.dromara.dynamictp.common.manager.EventBusManager; +import org.dromara.dynamictp.common.notifier.type.NotifyItemTypeRegistry; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; -import org.dromara.dynamictp.common.spring.OnceApplicationContextEventListener; import org.dromara.dynamictp.core.DtpRegistry; import org.dromara.dynamictp.core.converter.ExecutorConverter; import org.dromara.dynamictp.core.handler.CollectorHandler; import org.dromara.dynamictp.core.notifier.manager.AlarmManager; import org.dromara.dynamictp.core.support.ExecutorWrapper; import org.dromara.dynamictp.core.support.ThreadPoolCreator; -import org.springframework.context.event.ContextRefreshedEvent; import java.util.Set; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.SCHEDULE_NOTIFY_ITEMS; /** * DtpMonitor related @@ -46,9 +46,9 @@ import static org.dromara.dynamictp.common.constant.DynamicTpConst.SCHEDULE_NOTI * @since 1.0.0 **/ @Slf4j -public class DtpMonitor extends OnceApplicationContextEventListener { +public class DtpMonitor { - private static final ScheduledExecutorService MONITOR_EXECUTOR = ThreadPoolCreator.newScheduledThreadPool("dtp-monitor", 1); + private static ScheduledExecutorService monitorExecutor; private final DtpProperties dtpProperties; @@ -58,10 +58,11 @@ public class DtpMonitor extends OnceApplicationContextEventListener { public DtpMonitor(DtpProperties dtpProperties) { this.dtpProperties = dtpProperties; + EventBusManager.register(this); } - @Override - protected synchronized void onContextRefreshedEvent(ContextRefreshedEvent event) { + @Subscribe + public synchronized void onContextRefreshedEvent(CustomContextRefreshedEvent event) { // if monitorInterval is same as before, do nothing. if (monitorInterval == dtpProperties.getMonitorInterval()) { return; @@ -70,21 +71,28 @@ public class DtpMonitor extends OnceApplicationContextEventListener { if (monitorFuture != null) { monitorFuture.cancel(true); } + // Compatible with the springboot devtool restart scenario. + if (monitorExecutor == null || monitorExecutor.isShutdown() || monitorExecutor.isTerminated()) { + monitorExecutor = ThreadPoolCreator.newScheduledThreadPool("dtp-monitor", 1); + } monitorInterval = dtpProperties.getMonitorInterval(); - monitorFuture = MONITOR_EXECUTOR.scheduleWithFixedDelay(this::run, - 0, dtpProperties.getMonitorInterval(), TimeUnit.SECONDS); + monitorFuture = monitorExecutor.scheduleWithFixedDelay(this::run, 0, monitorInterval, TimeUnit.SECONDS); } private void run() { Set executorNames = DtpRegistry.getAllExecutorNames(); - checkAlarm(executorNames); - collectMetrics(executorNames); + try { + checkAlarm(executorNames); + collectMetrics(executorNames); + } catch (Exception e) { + log.error("DynamicTp monitor, run error", e); + } } private void checkAlarm(Set executorNames) { executorNames.forEach(name -> { ExecutorWrapper wrapper = DtpRegistry.getExecutorWrapper(name); - AlarmManager.tryAlarmAsync(wrapper, SCHEDULE_NOTIFY_ITEMS); + AlarmManager.checkAndTryAlarmAsync(wrapper, NotifyItemTypeRegistry.getScheduleNotifyTypes()); }); publishAlarmCheckEvent(); } @@ -110,15 +118,15 @@ public class DtpMonitor extends OnceApplicationContextEventListener { private void publishCollectEvent() { CollectEvent event = new CollectEvent(this, dtpProperties); - ApplicationContextHolder.publishEvent(event); + EventBusManager.post(event); } private void publishAlarmCheckEvent() { AlarmCheckEvent event = new AlarmCheckEvent(this, dtpProperties); - ApplicationContextHolder.publishEvent(event); + EventBusManager.post(event); } public static void destroy() { - MONITOR_EXECUTOR.shutdownNow(); + monitorExecutor.shutdownNow(); } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/monitor/collector/MicroMeterCollector.java b/core/src/main/java/org/dromara/dynamictp/core/monitor/collector/MicroMeterCollector.java index 37b7f1d48b492307d27dcd28f9efca229697f781..3d3d3f69c51a6913a126335991b0d6810c77cf62 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/monitor/collector/MicroMeterCollector.java +++ b/core/src/main/java/org/dromara/dynamictp/core/monitor/collector/MicroMeterCollector.java @@ -17,13 +17,13 @@ package org.dromara.dynamictp.core.monitor.collector; +import cn.hutool.core.bean.BeanUtil; import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.Tag; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.em.CollectorTypeEnum; import org.dromara.dynamictp.common.entity.ThreadPoolStats; import org.dromara.dynamictp.common.util.CommonUtil; -import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.List; @@ -61,7 +61,7 @@ public class MicroMeterCollector extends AbstractCollector { if (Objects.isNull(oldStats)) { GAUGE_CACHE.put(threadPoolStats.getPoolName(), threadPoolStats); } else { - BeanUtils.copyProperties(threadPoolStats, oldStats); + BeanUtil.copyProperties(threadPoolStats, oldStats); } gauge(GAUGE_CACHE.get(threadPoolStats.getPoolName())); } diff --git a/core/src/main/java/org/dromara/dynamictp/core/monitor/collector/jmx/JMXCollector.java b/core/src/main/java/org/dromara/dynamictp/core/monitor/collector/jmx/JMXCollector.java index 366aab46561fb12d6d87bdbe941388a24dcb3e4e..aad1ea05830caef7dee1533a4e2c33d722a1dcbf 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/monitor/collector/jmx/JMXCollector.java +++ b/core/src/main/java/org/dromara/dynamictp/core/monitor/collector/jmx/JMXCollector.java @@ -17,6 +17,7 @@ package org.dromara.dynamictp.core.monitor.collector.jmx; +import cn.hutool.core.bean.BeanUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.em.CollectorTypeEnum; import org.dromara.dynamictp.common.entity.ThreadPoolStats; @@ -26,6 +27,8 @@ import javax.management.JMException; import javax.management.MBeanServer; import javax.management.ObjectName; import java.lang.management.ManagementFactory; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * ThreadPoolStatsInfo related @@ -37,15 +40,26 @@ public class JMXCollector extends AbstractCollector { public static final String DTP_METRIC_NAME_PREFIX = "dtp.thread.pool"; + /** + * 缓存的作用是将注册到JMX的数据,每次都是同一个对象 + */ + private static final Map GAUGE_CACHE = new ConcurrentHashMap<>(); + @Override public void collect(ThreadPoolStats threadPoolStats) { - try { - MBeanServer server = ManagementFactory.getPlatformMBeanServer(); - ObjectName name = new ObjectName(DTP_METRIC_NAME_PREFIX + ":name=" + threadPoolStats.getPoolName()); - ThreadPoolStatsJMX stats = new ThreadPoolStatsJMX(threadPoolStats); - server.registerMBean(stats, name); - } catch (JMException e) { - log.error("collect thread pool stats error", e); + if (GAUGE_CACHE.containsKey(threadPoolStats.getPoolName())) { + ThreadPoolStats poolStats = GAUGE_CACHE.get(threadPoolStats.getPoolName()); + BeanUtil.copyProperties(threadPoolStats, poolStats); + } else { + try { + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + ObjectName name = new ObjectName(DTP_METRIC_NAME_PREFIX + ":name=" + threadPoolStats.getPoolName()); + ThreadPoolStatsJMX stats = new ThreadPoolStatsJMX(threadPoolStats); + server.registerMBean(stats, name); + } catch (JMException e) { + log.error("collect thread pool stats error", e); + } + GAUGE_CACHE.put(threadPoolStats.getPoolName(), threadPoolStats); } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/AbstractDtpNotifier.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/AbstractDtpNotifier.java index dea14289e28290c74d81a12a6e9ac56d55322de9..e694c31f199b2dd8fad57350a147890efdbdfb89 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/AbstractDtpNotifier.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/AbstractDtpNotifier.java @@ -17,17 +17,18 @@ package org.dromara.dynamictp.core.notifier; +import cn.hutool.core.bean.BeanUtil; import com.google.common.base.Joiner; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; -import org.dromara.dynamictp.common.em.NotifyItemEnum; -import org.dromara.dynamictp.common.entity.AlarmInfo; +import org.dromara.dynamictp.common.entity.CustomNotifyParam; import org.dromara.dynamictp.common.entity.NotifyItem; import org.dromara.dynamictp.common.entity.NotifyPlatform; import org.dromara.dynamictp.common.entity.TpMainFields; import org.dromara.dynamictp.common.notifier.Notifier; +import org.dromara.dynamictp.common.notifier.type.CommonNotifyItemType; import org.dromara.dynamictp.common.util.CommonUtil; import org.dromara.dynamictp.common.util.DateUtil; import org.dromara.dynamictp.core.notifier.alarm.AlarmCounter; @@ -37,20 +38,16 @@ import org.dromara.dynamictp.core.notifier.context.DtpNotifyCtxHolder; import org.dromara.dynamictp.core.support.ExecutorWrapper; import org.dromara.dynamictp.core.system.SystemMetricManager; import org.slf4j.MDC; -import org.springframework.beans.BeanUtils; import java.lang.reflect.Field; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.concurrent.TimeUnit; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.TRACE_ID; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.UNKNOWN; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.*; import static org.dromara.dynamictp.core.notifier.manager.NotifyHelper.getAlarmKeys; import static org.dromara.dynamictp.core.notifier.manager.NotifyHelper.getAllAlarmKeys; + /** * AbstractDtpNotifier related * @@ -79,8 +76,8 @@ public abstract class AbstractDtpNotifier implements DtpNotifier { } @Override - public void sendAlarmMsg(NotifyPlatform notifyPlatform, NotifyItemEnum notifyItemEnum) { - String content = buildAlarmContent(notifyPlatform, notifyItemEnum); + public void sendAlarmMsg(NotifyPlatform notifyPlatform, CommonNotifyItemType notifyItemType) { + String content = buildAlarmContent(notifyPlatform, notifyItemType); if (StringUtils.isBlank(content)) { log.debug("Alarm content is empty, ignore send alarm message."); return; @@ -88,21 +85,29 @@ public abstract class AbstractDtpNotifier implements DtpNotifier { notifier.send(newTargetPlatform(notifyPlatform), content); } - protected String buildAlarmContent(NotifyPlatform platform, NotifyItemEnum notifyItemEnum) { + @Override + public void sendCustomAlarmMsg(NotifyPlatform notifyPlatform, CommonNotifyItemType notifyItemType, CustomNotifyParam customAlarmParam) { + // give a chance to override alarm content + log.warn("{} Custom alarm content is empty, ignore send custom alarm message.", notifyItemType.getType()); + } + + protected String buildAlarmContent(NotifyPlatform platform, CommonNotifyItemType notifyItemType) { AlarmCtx context = (AlarmCtx) DtpNotifyCtxHolder.get(); ExecutorWrapper executorWrapper = context.getExecutorWrapper(); - val executor = executorWrapper.getExecutor(); NotifyItem notifyItem = context.getNotifyItem(); + String threadPoolName = executorWrapper.getThreadPoolName(); + String alarmValue = notifyItem.getCount() + " / " + context.getAlarmInfo().getCount(); + String lastAlarmTime = AlarmCounter.getLastAlarmTime(threadPoolName, notifyItem); + + val executor = executorWrapper.getExecutor(); val statProvider = executorWrapper.getThreadPoolStatProvider(); - val alarmValue = notifyItem.getThreshold() + notifyItemEnum.getUnit() + " / " - + AlarmCounter.calcCurrentValue(executorWrapper, notifyItemEnum) + notifyItemEnum.getUnit(); String content = String.format( getAlarmTemplate(), CommonUtil.getInstance().getServiceName(), CommonUtil.getInstance().getIp() + ":" + CommonUtil.getInstance().getPort(), CommonUtil.getInstance().getEnv(), populatePoolName(executorWrapper), - populateAlarmItem(notifyItemEnum, executorWrapper), + populateAlarmItem(notifyItemType, notifyItem, executorWrapper), alarmValue, executor.getCorePoolSize(), executor.getMaximumPoolSize(), @@ -120,14 +125,15 @@ public abstract class AbstractDtpNotifier implements DtpNotifier { statProvider.getRejectedTaskCount(), statProvider.getRunTimeoutCount(), statProvider.getQueueTimeoutCount(), - Optional.ofNullable(context.getAlarmInfo()).map(AlarmInfo::getLastAlarmTime).orElse(UNKNOWN), + Optional.ofNullable(lastAlarmTime).orElse(UNKNOWN), DateUtil.now(), getReceives(notifyItem, platform), + notifyItem.getPeriod(), + notifyItem.getSilencePeriod(), getTraceInfo(), - notifyItem.getInterval(), getExtInfo() ); - return highlightAlarmContent(content, notifyItemEnum); + return highlightAlarmContent(content, notifyItemType); } protected String buildNoticeContent(NotifyPlatform platform, TpMainFields oldFields, List diffs) { @@ -182,7 +188,7 @@ public abstract class AbstractDtpNotifier implements DtpNotifier { private NotifyPlatform newTargetPlatform(NotifyPlatform platform) { NotifyPlatform targetPlatform = new NotifyPlatform(); - BeanUtils.copyProperties(platform, targetPlatform); + BeanUtil.copyProperties(platform, targetPlatform); BaseNotifyCtx context = DtpNotifyCtxHolder.get(); NotifyItem item = context.getNotifyItem(); @@ -199,14 +205,23 @@ public abstract class AbstractDtpNotifier implements DtpNotifier { return executorWrapper.getThreadPoolName() + " (" + poolAlisaName + ")"; } - protected String populateAlarmItem(NotifyItemEnum notifyType, ExecutorWrapper executorWrapper) { + protected String populateAlarmItem(CommonNotifyItemType notifyType, NotifyItem notifyItem, ExecutorWrapper executorWrapper) { String suffix = StringUtils.EMPTY; - if (notifyType == NotifyItemEnum.RUN_TIMEOUT) { - suffix = " (" + executorWrapper.getThreadPoolStatProvider().getRunTimeout() + "ms)"; - } else if (notifyType == NotifyItemEnum.QUEUE_TIMEOUT) { - suffix = " (" + executorWrapper.getThreadPoolStatProvider().getQueueTimeout() + "ms)"; + switch (notifyType.getType()) { + case RUN_TIMEOUT: + suffix = " (" + executorWrapper.getThreadPoolStatProvider().getRunTimeout() + "ms)"; + break; + case QUEUE_TIMEOUT: + suffix = " (" + executorWrapper.getThreadPoolStatProvider().getQueueTimeout() + "ms)"; + break; + case LIVENESS: + case CAPACITY: + suffix = " (" + notifyItem.getThreshold() + "%)"; + break; + default: + break; } - return notifyType.getValue() + suffix; + return notifyType.getType() + suffix; } private String highlightNotifyContent(String content, List diffs) { @@ -224,12 +239,12 @@ public abstract class AbstractDtpNotifier implements DtpNotifier { return content; } - private String highlightAlarmContent(String content, NotifyItemEnum notifyItemEnum) { + private String highlightAlarmContent(String content, CommonNotifyItemType notifyItemType) { if (StringUtils.isBlank(content) || Objects.isNull(getColors())) { return content; } - Set colorKeys = getAlarmKeys(notifyItemEnum); + Set colorKeys = getAlarmKeys(notifyItemType); Pair pair = getColors(); for (String field : colorKeys) { content = content.replace(field, pair.getLeft()); diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/DtpLarkNotifier.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/DtpLarkNotifier.java index eca3526211d33d02ba30b24e75e84f11879cfd76..2bac205430fb7b61abc90b1cafcd311e5e01c02f 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/DtpLarkNotifier.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/DtpLarkNotifier.java @@ -70,7 +70,7 @@ public class DtpLarkNotifier extends AbstractDtpNotifier { protected String formatReceivers(String receives) { return Arrays.stream(receives.split(",")) .map(r -> StringUtils.startsWith(r, LARK_OPENID_PREFIX) ? - String.format(LARK_AT_FORMAT_OPENID, r) : String.format(LARK_AT_FORMAT_USERNAME, r)) + String.format(LARK_AT_FORMAT_OPENID, r) : String.format(LARK_AT_FORMAT_USERNAME, r, r)) .collect(Collectors.joining(" ")); } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/DtpNotifier.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/DtpNotifier.java index f1e804e9e3803ff85cd64eb725387c7328ea149c..f433e1d1ee2669e2df05b1b7e44856acb4688348 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/DtpNotifier.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/DtpNotifier.java @@ -17,11 +17,13 @@ package org.dromara.dynamictp.core.notifier; +import org.dromara.dynamictp.common.entity.CustomNotifyParam; import org.dromara.dynamictp.common.entity.TpMainFields; -import org.dromara.dynamictp.common.em.NotifyItemEnum; import org.dromara.dynamictp.common.entity.NotifyPlatform; +import org.dromara.dynamictp.common.notifier.type.CommonNotifyItemType; import java.util.List; +import java.util.Map; /** * DtpNotifier related @@ -51,7 +53,15 @@ public interface DtpNotifier { * Send alarm message. * * @param notifyPlatform notify platform - * @param notifyItemEnum notify item enum + * @param notifyItemType notify item type */ - void sendAlarmMsg(NotifyPlatform notifyPlatform, NotifyItemEnum notifyItemEnum); + void sendAlarmMsg(NotifyPlatform notifyPlatform, CommonNotifyItemType notifyItemType); + + /** + * Send custom alarm message. + * @param notifyPlatform notify platform + * @param notifyItemType notify item type + * @param customAlarmParam custom alarm params + */ + void sendCustomAlarmMsg(NotifyPlatform notifyPlatform, CommonNotifyItemType notifyItemType, CustomNotifyParam customAlarmParam); } diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/alarm/AlarmCounter.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/alarm/AlarmCounter.java index 5e1271d2b97b77ba035d4de5e73131c024cb6a61..86a772a49e7e1104e8a871e24ecdb36fa04cef98 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/alarm/AlarmCounter.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/alarm/AlarmCounter.java @@ -17,18 +17,21 @@ package org.dromara.dynamictp.core.notifier.alarm; -import cn.hutool.core.util.NumberUtil; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import lombok.val; -import lombok.var; -import org.dromara.dynamictp.common.em.NotifyItemEnum; import org.dromara.dynamictp.common.entity.AlarmInfo; -import org.dromara.dynamictp.core.support.ExecutorWrapper; +import org.dromara.dynamictp.common.entity.NotifyItem; +import org.dromara.dynamictp.common.ex.DtpException; +import org.dromara.dynamictp.common.notifier.type.NotifyItemTypeRegistry; +import org.dromara.dynamictp.common.util.DateUtil; import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.UNKNOWN; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.CHANGE; /** * AlarmCounter related @@ -38,61 +41,56 @@ import static org.dromara.dynamictp.common.constant.DynamicTpConst.UNKNOWN; **/ public class AlarmCounter { - private static final Map ALARM_INFO_CACHE = new ConcurrentHashMap<>(); + private static final Map> ALARM_INFO_CACHE = new ConcurrentHashMap<>(); + + private static final Map LAST_ALARM_TIME_MAP = new ConcurrentHashMap<>(); private AlarmCounter() { } - public static void init(String threadPoolName, String notifyItemType) { - String key = buildKey(threadPoolName, notifyItemType); - val alarmInfo = new AlarmInfo().setNotifyItem(NotifyItemEnum.of(notifyItemType)); - ALARM_INFO_CACHE.putIfAbsent(key, alarmInfo); - } + public static void initAlarmCounter(String threadPoolName, NotifyItem notifyItem) { + if (CHANGE.equalsIgnoreCase(notifyItem.getType())) { + return; + } - public static AlarmInfo getAlarmInfo(String threadPoolName, String notifyItemType) { - String key = buildKey(threadPoolName, notifyItemType); - return ALARM_INFO_CACHE.get(key); + String key = buildKey(threadPoolName, notifyItem.getType()); + Cache cache = CacheBuilder.newBuilder() + .expireAfterWrite(notifyItem.getPeriod(), TimeUnit.SECONDS) + .build(); + ALARM_INFO_CACHE.put(key, cache); } - public static String getCount(String threadPoolName, String notifyItemType) { - String key = buildKey(threadPoolName, notifyItemType); - val alarmInfo = ALARM_INFO_CACHE.get(key); - if (Objects.nonNull(alarmInfo)) { - return String.valueOf(alarmInfo.getCount()); + public static AlarmInfo getAlarmInfo(String threadPoolName, NotifyItem notifyItem) { + String key = buildKey(threadPoolName, notifyItem.getType()); + val cache = ALARM_INFO_CACHE.get(key); + if (Objects.isNull(cache)) { + throw new DtpException("Alarm info cache has not been initialized for " + key); } - return UNKNOWN; + return cache.getIfPresent(notifyItem.getType()); } - public static void reset(String threadPoolName, String notifyItemType) { - String key = buildKey(threadPoolName, notifyItemType); - var alarmInfo = ALARM_INFO_CACHE.get(key); - alarmInfo.reset(); - } - - public static void incAlarmCounter(String threadPoolName, String notifyItemType) { - String key = buildKey(threadPoolName, notifyItemType); - var alarmInfo = ALARM_INFO_CACHE.get(key); + public static void reset(String threadPoolName, NotifyItem notifyItem) { + val alarmInfo = getAlarmInfo(threadPoolName, notifyItem); if (Objects.nonNull(alarmInfo)) { - alarmInfo.incCounter(); + alarmInfo.reset(); } + LAST_ALARM_TIME_MAP.put(buildKey(threadPoolName, notifyItem.getType()), DateUtil.now()); } - public static int calcCurrentValue(ExecutorWrapper wrapper, NotifyItemEnum itemEnum) { - val executor = wrapper.getExecutor(); - switch (itemEnum) { - case CAPACITY: - return (int) (NumberUtil.div(executor.getQueueSize(), executor.getQueueCapacity(), 2) * 100); - case LIVENESS: - return (int) (NumberUtil.div(executor.getActiveCount(), executor.getMaximumPoolSize(), 2) * 100); - case REJECT: - case RUN_TIMEOUT: - case QUEUE_TIMEOUT: - return Integer.parseInt(getCount(wrapper.getThreadPoolName(), itemEnum.getValue())); - default: - return 0; + public static void incAlarmCount(String threadPoolName, NotifyItem notifyItem) { + AlarmInfo alarmInfo = getAlarmInfo(threadPoolName, notifyItem); + if (Objects.isNull(alarmInfo)) { + String key = buildKey(threadPoolName, notifyItem.getType()); + alarmInfo = new AlarmInfo().setNotifyItem(NotifyItemTypeRegistry.getNotifyItemType(notifyItem.getType())); + ALARM_INFO_CACHE.get(key).put(notifyItem.getType(), alarmInfo); } + alarmInfo.incCounter(); + } + + public static String getLastAlarmTime(String threadPoolName, NotifyItem notifyItem) { + return LAST_ALARM_TIME_MAP.get(buildKey(threadPoolName, notifyItem.getType())); } private static String buildKey(String threadPoolName, String notifyItemType) { - return threadPoolName + ":" + notifyItemType; + return threadPoolName + "#" + notifyItemType; } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/alarm/AlarmLimiter.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/alarm/AlarmLimiter.java index 66d790836e65f5c675b1871a08f820bc805cc49e..4bfeeb2adc60f168b6b2b0e4dd35237cd6d10586 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/alarm/AlarmLimiter.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/alarm/AlarmLimiter.java @@ -17,18 +17,19 @@ package org.dromara.dynamictp.core.notifier.alarm; -import org.dromara.dynamictp.common.em.NotifyItemEnum; -import org.dromara.dynamictp.common.entity.NotifyItem; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import lombok.val; import org.apache.commons.lang3.StringUtils; +import org.dromara.dynamictp.common.entity.NotifyItem; import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.CHANGE; + /** * AlarmLimiter related * @@ -42,13 +43,13 @@ public class AlarmLimiter { private AlarmLimiter() { } public static void initAlarmLimiter(String threadPoolName, NotifyItem notifyItem) { - if (NotifyItemEnum.CHANGE.getValue().equalsIgnoreCase(notifyItem.getType())) { + if (CHANGE.equalsIgnoreCase(notifyItem.getType())) { return; } String key = genKey(threadPoolName, notifyItem.getType()); Cache cache = CacheBuilder.newBuilder() - .expireAfterWrite(notifyItem.getInterval(), TimeUnit.SECONDS) + .expireAfterWrite(notifyItem.getSilencePeriod(), TimeUnit.SECONDS) .build(); ALARM_LIMITER.put(key, cache); } @@ -66,12 +67,12 @@ public class AlarmLimiter { return cache.getIfPresent(type); } - public static boolean ifAlarm(String threadPoolName, String type) { - String key = genKey(threadPoolName, type); - return StringUtils.isBlank(getAlarmLimitInfo(key, type)); + public static boolean isAllowed(String threadPoolName, NotifyItem notifyItem) { + String key = genKey(threadPoolName, notifyItem.getType()); + return StringUtils.isBlank(getAlarmLimitInfo(key, notifyItem.getType())); } public static String genKey(String threadPoolName, String type) { - return threadPoolName + ":" + type; + return threadPoolName + "#" + type; } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/capture/CapturedBlockingQueue.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/capture/CapturedBlockingQueue.java index 96fbb068bd029699920059675ba06aac90eee44c..dbfc71fe7ffe7dd4ff2d570123203a5227677ef4 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/capture/CapturedBlockingQueue.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/capture/CapturedBlockingQueue.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.core.notifier.capture; -import org.dromara.dynamictp.core.support.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import java.util.AbstractQueue; import java.util.Collection; diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/capture/CapturedExecutor.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/capture/CapturedExecutor.java index d03b5d8605b33e3d727d46b628830bb3737b77a4..796da52507a236d7dc1980bdae743df8a0c88dd9 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/capture/CapturedExecutor.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/capture/CapturedExecutor.java @@ -17,13 +17,13 @@ package org.dromara.dynamictp.core.notifier.capture; -import org.dromara.dynamictp.common.em.NotifyItemEnum; import org.dromara.dynamictp.common.entity.NotifyPlatform; +import org.dromara.dynamictp.common.notifier.type.CommonNotifyItemType; import org.dromara.dynamictp.core.executor.DtpExecutor; import org.dromara.dynamictp.core.notifier.AbstractDtpNotifier; import org.dromara.dynamictp.core.notifier.context.BaseNotifyCtx; import org.dromara.dynamictp.core.notifier.manager.AlarmManager; -import org.dromara.dynamictp.core.support.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import java.util.concurrent.BlockingQueue; import java.util.concurrent.RejectedExecutionHandler; @@ -34,7 +34,7 @@ import java.util.concurrent.TimeUnit; * is to capture DtpExecutor's status when construct {@link BaseNotifyCtx} during {@link AlarmManager#doTryAlarm}. *

* In other words, this can ensure that the thread pool status when the alarm threshold is triggered is - * consistent with the content in the {@link AbstractDtpNotifier#buildAlarmContent(NotifyPlatform, NotifyItemEnum)} + * consistent with the content in the {@link AbstractDtpNotifier#buildAlarmContent(NotifyPlatform, CommonNotifyItemType)} * * @author ruoan * @since 1.1.3 diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/AlarmBaseFilter.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/BaseAlarmFilter.java similarity index 57% rename from core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/AlarmBaseFilter.java rename to core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/BaseAlarmFilter.java index bb4b5900fa68446253f775f9e42aab4ea23a3674..a1a5c461c140c70645aa7c3ca51eebe19f44fc88 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/AlarmBaseFilter.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/BaseAlarmFilter.java @@ -17,63 +17,55 @@ package org.dromara.dynamictp.core.notifier.chain.filter; -import org.dromara.dynamictp.core.support.ExecutorWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.dromara.dynamictp.common.entity.AlarmInfo; import org.dromara.dynamictp.common.entity.NotifyItem; import org.dromara.dynamictp.common.pattern.filter.Invoker; +import org.dromara.dynamictp.core.notifier.alarm.AlarmCounter; +import org.dromara.dynamictp.core.notifier.context.AlarmCtx; import org.dromara.dynamictp.core.notifier.context.BaseNotifyCtx; -import org.dromara.dynamictp.core.notifier.alarm.AlarmLimiter; -import org.dromara.dynamictp.core.notifier.manager.AlarmManager; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.apache.commons.collections4.CollectionUtils; +import org.dromara.dynamictp.core.support.ExecutorWrapper; import java.util.Objects; /** - * AlarmBaseFilter related + * BaseAlarmFilter related * * @author yanhom * @since 1.0.8 **/ @Slf4j -public class AlarmBaseFilter implements NotifyFilter { - - private static final Object SEND_LOCK = new Object(); +public class BaseAlarmFilter implements NotifyFilter { @Override public void doFilter(BaseNotifyCtx context, Invoker nextInvoker) { - - val executorWrapper = context.getExecutorWrapper(); - val notifyItem = context.getNotifyItem(); + ExecutorWrapper executorWrapper = context.getExecutorWrapper(); + NotifyItem notifyItem = context.getNotifyItem(); if (Objects.isNull(notifyItem) || !satisfyBaseCondition(notifyItem, executorWrapper)) { return; } - boolean ifAlarm = AlarmLimiter.ifAlarm(executorWrapper.getThreadPoolName(), notifyItem.getType()); - if (!ifAlarm) { - log.debug("DynamicTp notify, alarm limit, threadPoolName: {}, notifyItem: {}", - executorWrapper.getThreadPoolName(), notifyItem.getType()); + String threadPoolName = executorWrapper.getThreadPoolName(); + AlarmCounter.incAlarmCount(threadPoolName, notifyItem); + AlarmInfo alarmInfo = AlarmCounter.getAlarmInfo(threadPoolName, notifyItem); + if (Objects.isNull(alarmInfo)) { return; } - if (!AlarmManager.checkThreshold(executorWrapper, context.getNotifyItemEnum(), notifyItem)) { - return; - } - synchronized (SEND_LOCK) { - // recheck alarm limit. - ifAlarm = AlarmLimiter.ifAlarm(executorWrapper.getThreadPoolName(), notifyItem.getType()); - if (!ifAlarm) { - log.warn("DynamicTp notify, concurrent send, alarm limit, threadPoolName: {}, notifyItem: {}", - executorWrapper.getThreadPoolName(), notifyItem.getType()); - return; + if (alarmInfo.getCount() < notifyItem.getCount()) { + if (log.isDebugEnabled()) { + log.debug("DynamicTp notify, alarm count not reached, current count: {}, threshold: {}, threadPoolName: {}, notifyItem: {}", + alarmInfo.getCount(), notifyItem.getCount(), threadPoolName, notifyItem); } - AlarmLimiter.putVal(executorWrapper.getThreadPoolName(), notifyItem.getType()); + return; } + ((AlarmCtx) context).setAlarmInfo(alarmInfo); nextInvoker.invoke(context); } - private boolean satisfyBaseCondition(NotifyItem notifyItem, ExecutorWrapper executor) { - return executor.isNotifyEnabled() + private boolean satisfyBaseCondition(NotifyItem notifyItem, ExecutorWrapper executorWrapper) { + return executorWrapper.isNotifyEnabled() && notifyItem.isEnabled() && CollectionUtils.isNotEmpty(notifyItem.getPlatformIds()); } diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/NoticeBaseFilter.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/BaseNoticeFilter.java similarity index 90% rename from core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/NoticeBaseFilter.java rename to core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/BaseNoticeFilter.java index 4a60c2863f498e7b161ceae533a7884956b07706..938c9e5993be57890f7d8c846ae2e849882a2616 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/NoticeBaseFilter.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/BaseNoticeFilter.java @@ -17,30 +17,28 @@ package org.dromara.dynamictp.core.notifier.chain.filter; -import org.dromara.dynamictp.core.support.ExecutorWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.dromara.dynamictp.common.entity.NotifyItem; import org.dromara.dynamictp.common.pattern.filter.Invoker; import org.dromara.dynamictp.core.notifier.context.BaseNotifyCtx; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.apache.commons.collections4.CollectionUtils; +import org.dromara.dynamictp.core.support.ExecutorWrapper; import java.util.Objects; /** - * NoticeBaseFilter related + * BaseNoticeFilter related * * @author yanhom * @since 1.1.0 **/ @Slf4j -public class NoticeBaseFilter implements NotifyFilter { +public class BaseNoticeFilter implements NotifyFilter { @Override public void doFilter(BaseNotifyCtx context, Invoker nextInvoker) { - - val executorWrapper = context.getExecutorWrapper(); - val notifyItem = context.getNotifyItem(); + ExecutorWrapper executorWrapper = context.getExecutorWrapper(); + NotifyItem notifyItem = context.getNotifyItem(); if (Objects.isNull(notifyItem) || !satisfyBaseCondition(notifyItem, executorWrapper)) { log.debug("DynamicTp notify, no platforms configured or notification is not enabled, threadPoolName: {}", executorWrapper.getThreadPoolName()); diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/SilentCheckFilter.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/SilentCheckFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..2ece21fb8217ea1e91fd150258139dbd8f29dec7 --- /dev/null +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/filter/SilentCheckFilter.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.core.notifier.chain.filter; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.common.entity.NotifyItem; +import org.dromara.dynamictp.common.pattern.filter.Invoker; +import org.dromara.dynamictp.core.notifier.alarm.AlarmLimiter; +import org.dromara.dynamictp.core.notifier.context.BaseNotifyCtx; +import org.dromara.dynamictp.core.support.ExecutorWrapper; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * SilentCheckFilter related + * + * @author yanhom + * @since 1.0.0 + **/ +@Slf4j +public class SilentCheckFilter implements NotifyFilter { + + private static final Map LOCK_MAP = new ConcurrentHashMap<>(); + + @Override + public int getOrder() { + return 5; + } + + @Override + public void doFilter(BaseNotifyCtx context, Invoker nextInvoker) { + if (isSilent(context)) { + return; + } + nextInvoker.invoke(context); + } + + protected boolean isSilent(BaseNotifyCtx context) { + // silence period <= 0 indicates that no silence check will be conducted. + NotifyItem notifyItem = context.getNotifyItem(); + if (notifyItem.getSilencePeriod() <= 0) { + return false; + } + + ExecutorWrapper executorWrapper = context.getExecutorWrapper(); + String lockKey = executorWrapper.getThreadPoolName(); + Lock lock = LOCK_MAP.computeIfAbsent(lockKey, k -> new ReentrantLock()); + + lock.lock(); + try { + boolean isAllowed = AlarmLimiter.isAllowed(executorWrapper.getThreadPoolName(), notifyItem); + if (!isAllowed) { + if (log.isDebugEnabled()) { + log.debug("DynamicTp notify, trigger rate limit, threadPoolName: {}, notifyItem: {}", + executorWrapper.getThreadPoolName(), notifyItem.getType()); + } + return true; + } + AlarmLimiter.putVal(executorWrapper.getThreadPoolName(), notifyItem.getType()); + } finally { + lock.unlock(); + } + return false; + } +} diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/invoker/AlarmInvoker.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/invoker/AlarmInvoker.java index 637baa46dd870b8e1112e42b859ee2dfd0c4a364..e6d93ff17685c52fcefe32b643e5e11d91354aed 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/invoker/AlarmInvoker.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/chain/invoker/AlarmInvoker.java @@ -17,14 +17,13 @@ package org.dromara.dynamictp.core.notifier.chain.invoker; -import org.dromara.dynamictp.common.em.NotifyItemEnum; +import lombok.val; +import org.dromara.dynamictp.common.notifier.type.NotifyItemTypeRegistry; import org.dromara.dynamictp.common.pattern.filter.Invoker; -import org.dromara.dynamictp.core.notifier.context.AlarmCtx; -import org.dromara.dynamictp.core.notifier.context.BaseNotifyCtx; -import org.dromara.dynamictp.core.notifier.context.DtpNotifyCtxHolder; import org.dromara.dynamictp.core.handler.NotifierHandler; import org.dromara.dynamictp.core.notifier.alarm.AlarmCounter; -import lombok.val; +import org.dromara.dynamictp.core.notifier.context.BaseNotifyCtx; +import org.dromara.dynamictp.core.notifier.context.DtpNotifyCtxHolder; /** * AlarmInvoker related @@ -36,17 +35,12 @@ public class AlarmInvoker implements Invoker { @Override public void invoke(BaseNotifyCtx context) { - - val alarmCtx = (AlarmCtx) context; - val executorWrapper = alarmCtx.getExecutorWrapper(); - val notifyItem = alarmCtx.getNotifyItem(); - val alarmInfo = AlarmCounter.getAlarmInfo(executorWrapper.getThreadPoolName(), notifyItem.getType()); - alarmCtx.setAlarmInfo(alarmInfo); - + val executorWrapper = context.getExecutorWrapper(); + val notifyItem = context.getNotifyItem(); try { DtpNotifyCtxHolder.set(context); - NotifierHandler.getInstance().sendAlarm(NotifyItemEnum.of(notifyItem.getType())); - AlarmCounter.reset(executorWrapper.getThreadPoolName(), notifyItem.getType()); + NotifierHandler.getInstance().sendAlarm(NotifyItemTypeRegistry.getNotifyItemType(notifyItem.getType())); + AlarmCounter.reset(executorWrapper.getThreadPoolName(), notifyItem); } finally { DtpNotifyCtxHolder.remove(); } diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/context/BaseNotifyCtx.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/context/BaseNotifyCtx.java index 432d42c1d039f0bac0e7be53b7fece38fd889361..719b425741521418d9d1dc9bd2657cb2e416596e 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/context/BaseNotifyCtx.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/context/BaseNotifyCtx.java @@ -17,8 +17,9 @@ package org.dromara.dynamictp.core.notifier.context; -import org.dromara.dynamictp.common.em.NotifyItemEnum; import org.dromara.dynamictp.common.entity.NotifyItem; +import org.dromara.dynamictp.common.notifier.type.CommonNotifyItemType; +import org.dromara.dynamictp.common.notifier.type.NotifyItemTypeRegistry; import org.dromara.dynamictp.core.support.ExecutorWrapper; import lombok.Data; @@ -42,7 +43,7 @@ public class BaseNotifyCtx { this.notifyItem = notifyItem; } - public NotifyItemEnum getNotifyItemEnum() { - return NotifyItemEnum.of(notifyItem.getType()); + public CommonNotifyItemType getNotifyItemType() { + return NotifyItemTypeRegistry.getNotifyItemType(notifyItem.getType()); } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/context/CustomAlarmCtx.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/context/CustomAlarmCtx.java new file mode 100644 index 0000000000000000000000000000000000000000..e01031b290ee9903f565909a5c8839106360f564 --- /dev/null +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/context/CustomAlarmCtx.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.dynamictp.core.notifier.context; + +import org.dromara.dynamictp.common.entity.CustomNotifyParam; +import org.dromara.dynamictp.common.entity.NotifyItem; +import org.dromara.dynamictp.core.support.ExecutorWrapper; + + +public class CustomAlarmCtx extends AlarmCtx { + + private CustomNotifyParam customAlarmParam; + + public CustomAlarmCtx(ExecutorWrapper wrapper, NotifyItem notifyItem) { + super(wrapper, notifyItem); + } + + public CustomNotifyParam getCustomAlarmParam() { + return customAlarmParam; + } + + public void setCustomAlarmParam(CustomNotifyParam customAlarmParam) { + this.customAlarmParam = customAlarmParam; + } +} diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/AlarmManager.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/AlarmManager.java index 378986196a6fec52e579fbe9bb6ccc31e946d7ba..24ed61d5374ddd4c82207c229ad8dbef42d41fcc 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/AlarmManager.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/AlarmManager.java @@ -21,15 +21,16 @@ import cn.hutool.core.util.NumberUtil; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import lombok.val; -import org.dromara.dynamictp.common.em.NotifyItemEnum; import org.dromara.dynamictp.common.em.RejectedTypeEnum; -import org.dromara.dynamictp.common.entity.AlarmInfo; +import org.dromara.dynamictp.common.entity.CustomNotifyParam; import org.dromara.dynamictp.common.entity.NotifyItem; +import org.dromara.dynamictp.common.notifier.type.CommonNotifyItemType; import org.dromara.dynamictp.common.pattern.filter.InvokerChain; import org.dromara.dynamictp.core.notifier.alarm.AlarmCounter; import org.dromara.dynamictp.core.notifier.alarm.AlarmLimiter; import org.dromara.dynamictp.core.notifier.context.AlarmCtx; import org.dromara.dynamictp.core.notifier.context.BaseNotifyCtx; +import org.dromara.dynamictp.core.notifier.context.CustomAlarmCtx; import org.dromara.dynamictp.core.support.ExecutorWrapper; import org.dromara.dynamictp.core.support.ThreadPoolBuilder; import org.dromara.dynamictp.core.support.task.runnable.DtpRunnable; @@ -37,10 +38,12 @@ import org.dromara.dynamictp.core.support.task.wrapper.TaskWrappers; import org.slf4j.MDC; import java.util.List; +import java.util.Map; import java.util.concurrent.ExecutorService; import static org.dromara.dynamictp.common.constant.DynamicTpConst.TRACE_ID; import static org.dromara.dynamictp.common.em.QueueTypeEnum.LINKED_BLOCKING_QUEUE; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.*; /** * AlarmManager related @@ -75,10 +78,18 @@ public class AlarmManager { public static void initAlarm(String poolName, NotifyItem notifyItem) { AlarmLimiter.initAlarmLimiter(poolName, notifyItem); - AlarmCounter.init(poolName, notifyItem.getType()); + AlarmCounter.initAlarmCounter(poolName, notifyItem); } - public static void tryAlarmAsync(ExecutorWrapper executorWrapper, NotifyItemEnum notifyType, Runnable runnable) { + public static void initAlarmLimiter(String poolName, NotifyItem notifyItem) { + AlarmLimiter.initAlarmLimiter(poolName, notifyItem); + } + + public static void initAlarmCounter(String poolName, NotifyItem notifyItem) { + AlarmCounter.initAlarmCounter(poolName, notifyItem); + } + + public static void tryAlarmAsync(ExecutorWrapper executorWrapper, String notifyType, Runnable runnable) { preAlarm(runnable); try { ALARM_EXECUTOR.execute(() -> doTryAlarm(executorWrapper, notifyType)); @@ -87,21 +98,73 @@ public class AlarmManager { } } - public static void tryAlarmAsync(ExecutorWrapper executorWrapper, List notifyTypes) { - ALARM_EXECUTOR.execute(() -> notifyTypes.forEach(x -> doTryAlarm(executorWrapper, x))); + /** + * try to send custom alarm + */ + public static void tryCustomAlarmAsync(ExecutorWrapper executorWrapper, String customAlarmType, Runnable runnable, + CustomNotifyParam customNotifyParam) { + preAlarm(runnable); + try { + ALARM_EXECUTOR.execute(() -> doTryCustomAlarm(executorWrapper, customAlarmType, customNotifyParam)); + } finally { + postAlarm(runnable); + } } - public static void doTryAlarm(ExecutorWrapper executorWrapper, NotifyItemEnum notifyType) { - AlarmCounter.incAlarmCounter(executorWrapper.getThreadPoolName(), notifyType.getValue()); + public static void checkAndTryAlarmAsync(ExecutorWrapper executorWrapper, List notifyTypes) { + ALARM_EXECUTOR.execute(() -> notifyTypes.forEach(x -> doCheckAndTryAlarm(executorWrapper, x))); + } + + public static void doCheckAndTryAlarm(ExecutorWrapper executorWrapper, CommonNotifyItemType notifyType) { + NotifyHelper.getNotifyItem(executorWrapper, notifyType.getType()).ifPresent(notifyItem -> { + if (hasReachedThreshold(executorWrapper, notifyType, notifyItem)) { + ALARM_INVOKER_CHAIN.proceed(new AlarmCtx(executorWrapper, notifyItem)); + } + }); + } + + public static void tryAlarmAsync(ExecutorWrapper executorWrapper, List notifyTypes) { + ALARM_EXECUTOR.execute(() -> notifyTypes.forEach(x -> doTryAlarm(executorWrapper, x.getType()))); + } + + public static void doTryCustomAlarm(ExecutorWrapper executorWrapper, String customAlarmType, CustomNotifyParam customNotifyParam) { + NotifyHelper.getNotifyItem(executorWrapper, customAlarmType).ifPresent(notifyItem -> { + CustomAlarmCtx customAlarmCtx = new CustomAlarmCtx(executorWrapper, notifyItem); + customAlarmCtx.setCustomAlarmParam(customNotifyParam); + ALARM_INVOKER_CHAIN.proceed(customAlarmCtx); + }); + } + + public static void doTryAlarm(ExecutorWrapper executorWrapper, String notifyType) { NotifyHelper.getNotifyItem(executorWrapper, notifyType).ifPresent(notifyItem -> { val alarmCtx = new AlarmCtx(executorWrapper, notifyItem); ALARM_INVOKER_CHAIN.proceed(alarmCtx); }); } - public static boolean checkThreshold(ExecutorWrapper executor, NotifyItemEnum notifyType, NotifyItem notifyItem) { + private static void preAlarm(Runnable runnable) { + if (runnable instanceof DtpRunnable) { + MDC.put(TRACE_ID, ((DtpRunnable) runnable).getTraceId()); + } + } + + private static void postAlarm(Runnable runnable) { + if (runnable instanceof DtpRunnable) { + MDC.remove(TRACE_ID); + } + } - switch (notifyType) { + /** + * Check if the threshold is reached, for capacity and liveness we need to check. + * for reject, run timeout and queue timeout we don't need to check here, because it has been checked before. + * + * @param executor the executor + * @param notifyType the notify type + * @param notifyItem the notify item + * @return true if the threshold is reached, false otherwise + */ + private static boolean hasReachedThreshold(ExecutorWrapper executor, CommonNotifyItemType notifyType, NotifyItem notifyItem) { + switch (notifyType.getType()) { case CAPACITY: return checkCapacity(executor, notifyItem); case LIVENESS: @@ -109,48 +172,40 @@ public class AlarmManager { case REJECT: case RUN_TIMEOUT: case QUEUE_TIMEOUT: - return checkWithAlarmInfo(executor, notifyItem); + return true; default: log.error("Unsupported alarm type [{}]", notifyType); return false; } } - public static void destroy() { - ALARM_EXECUTOR.shutdownNow(); - } - private static boolean checkLiveness(ExecutorWrapper executorWrapper, NotifyItem notifyItem) { val executor = executorWrapper.getExecutor(); int maximumPoolSize = executor.getMaximumPoolSize(); double div = NumberUtil.div(executor.getActiveCount(), maximumPoolSize, 2) * 100; - return div >= notifyItem.getThreshold(); + if (div >= notifyItem.getThreshold()) { + log.warn("DynamicTp monitor, current liveness [{}] >= threshold [{}], threadPoolName: {}", + div, notifyItem.getThreshold(), executorWrapper.getThreadPoolName()); + return true; + } + return false; } private static boolean checkCapacity(ExecutorWrapper executorWrapper, NotifyItem notifyItem) { - val executor = executorWrapper.getExecutor(); if (executor.getQueueSize() <= 0) { return false; } double div = NumberUtil.div(executor.getQueueSize(), executor.getQueueCapacity(), 2) * 100; - return div >= notifyItem.getThreshold(); - } - - private static boolean checkWithAlarmInfo(ExecutorWrapper executorWrapper, NotifyItem notifyItem) { - AlarmInfo alarmInfo = AlarmCounter.getAlarmInfo(executorWrapper.getThreadPoolName(), notifyItem.getType()); - return alarmInfo.getCount() >= notifyItem.getThreshold(); - } - - private static void preAlarm(Runnable runnable) { - if (runnable instanceof DtpRunnable) { - MDC.put(TRACE_ID, ((DtpRunnable) runnable).getTraceId()); + if (div >= notifyItem.getThreshold()) { + log.warn("DynamicTp monitor, current queue utilization [{}] >= threshold [{}], threadPoolName: {}", + div, notifyItem.getThreshold(), executorWrapper.getThreadPoolName()); + return true; } + return false; } - private static void postAlarm(Runnable runnable) { - if (runnable instanceof DtpRunnable) { - MDC.remove(TRACE_ID); - } + public static void destroy() { + ALARM_EXECUTOR.shutdownNow(); } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/NoticeManager.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/NoticeManager.java index a833160bf96fb973b8af1ab9f51e42ae5a361bd6..ff4a24fd1f2a0f579e419b7e29190d39eb9a7e59 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/NoticeManager.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/NoticeManager.java @@ -29,8 +29,8 @@ import org.dromara.dynamictp.core.support.ThreadPoolBuilder; import java.util.List; import java.util.concurrent.ExecutorService; -import static org.dromara.dynamictp.common.em.NotifyItemEnum.CHANGE; import static org.dromara.dynamictp.common.em.QueueTypeEnum.LINKED_BLOCKING_QUEUE; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.CHANGE; /** * NoticeManager related diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/NotifyFilterBuilder.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/NotifyFilterBuilder.java index f564fa2110ecd2bf748b5d2476de173f838549f4..311e3d107957c6e3e2dd585dddd1369aa029de34 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/NotifyFilterBuilder.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/NotifyFilterBuilder.java @@ -17,20 +17,22 @@ package org.dromara.dynamictp.core.notifier.manager; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; import org.dromara.dynamictp.common.em.NotifyTypeEnum; import org.dromara.dynamictp.common.pattern.filter.Filter; import org.dromara.dynamictp.common.pattern.filter.InvokerChain; import org.dromara.dynamictp.common.pattern.filter.InvokerChainFactory; +import org.dromara.dynamictp.core.notifier.chain.filter.SilentCheckFilter; import org.dromara.dynamictp.core.notifier.context.BaseNotifyCtx; -import org.dromara.dynamictp.core.notifier.chain.filter.AlarmBaseFilter; -import org.dromara.dynamictp.core.notifier.chain.filter.NoticeBaseFilter; +import org.dromara.dynamictp.core.notifier.chain.filter.BaseAlarmFilter; +import org.dromara.dynamictp.core.notifier.chain.filter.BaseNoticeFilter; import org.dromara.dynamictp.core.notifier.chain.filter.NotifyFilter; import org.dromara.dynamictp.core.notifier.chain.invoker.AlarmInvoker; import org.dromara.dynamictp.core.notifier.chain.invoker.NoticeInvoker; import com.google.common.collect.Lists; import lombok.val; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; + import java.util.Collection; import java.util.Comparator; import java.util.stream.Collectors; @@ -46,9 +48,10 @@ public class NotifyFilterBuilder { private NotifyFilterBuilder() { } public static InvokerChain getAlarmInvokerChain() { - val filters = ApplicationContextHolder.getBeansOfType(NotifyFilter.class); + val filters = ContextManagerHelper.getBeansOfType(NotifyFilter.class); Collection alarmFilters = Lists.newArrayList(filters.values()); - alarmFilters.add(new AlarmBaseFilter()); + alarmFilters.add(new BaseAlarmFilter()); + alarmFilters.add(new SilentCheckFilter()); alarmFilters = alarmFilters.stream() .filter(x -> x.supports(NotifyTypeEnum.ALARM)) .sorted(Comparator.comparing(Filter::getOrder)) @@ -57,9 +60,9 @@ public class NotifyFilterBuilder { } public static InvokerChain getCommonInvokerChain() { - val filters = ApplicationContextHolder.getBeansOfType(NotifyFilter.class); + val filters = ContextManagerHelper.getBeansOfType(NotifyFilter.class); Collection noticeFilters = Lists.newArrayList(filters.values()); - noticeFilters.add(new NoticeBaseFilter()); + noticeFilters.add(new BaseNoticeFilter()); noticeFilters = noticeFilters.stream() .filter(x -> x.supports(NotifyTypeEnum.COMMON)) .sorted(Comparator.comparing(Filter::getOrder)) diff --git a/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/NotifyHelper.java b/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/NotifyHelper.java index f1636186d4c26d1b4e5e89cbb4c7745a2d8acd0c..c4ffdc4d76575838af3b4e98c4611521ae24577e 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/NotifyHelper.java +++ b/core/src/main/java/org/dromara/dynamictp/core/notifier/manager/NotifyHelper.java @@ -23,13 +23,13 @@ import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.apache.commons.collections4.CollectionUtils; -import org.dromara.dynamictp.common.em.NotifyItemEnum; import org.dromara.dynamictp.common.entity.DtpExecutorProps; import org.dromara.dynamictp.common.entity.NotifyItem; import org.dromara.dynamictp.common.entity.NotifyPlatform; import org.dromara.dynamictp.common.entity.TpExecutorProps; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; +import org.dromara.dynamictp.common.notifier.type.CommonNotifyItemType; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; import org.dromara.dynamictp.common.util.StreamUtil; import org.dromara.dynamictp.core.executor.DtpExecutor; import org.dromara.dynamictp.core.support.ExecutorWrapper; @@ -43,11 +43,8 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; -import static org.dromara.dynamictp.common.em.NotifyItemEnum.CAPACITY; -import static org.dromara.dynamictp.common.em.NotifyItemEnum.LIVENESS; -import static org.dromara.dynamictp.common.em.NotifyItemEnum.QUEUE_TIMEOUT; -import static org.dromara.dynamictp.common.em.NotifyItemEnum.REJECT; -import static org.dromara.dynamictp.common.em.NotifyItemEnum.RUN_TIMEOUT; + +import static org.dromara.dynamictp.common.constant.DynamicTpConst.*; import static org.dromara.dynamictp.common.entity.NotifyItem.mergeAllNotifyItems; /** @@ -78,11 +75,11 @@ public class NotifyHelper { private static final Map> ALARM_KEYS = Maps.newHashMap(); static { - ALARM_KEYS.put(LIVENESS.name(), LIVENESS_ALARM_KEYS); - ALARM_KEYS.put(CAPACITY.name(), CAPACITY_ALARM_KEYS); - ALARM_KEYS.put(REJECT.name(), REJECT_ALARM_KEYS); - ALARM_KEYS.put(RUN_TIMEOUT.name(), RUN_TIMEOUT_ALARM_KEYS); - ALARM_KEYS.put(QUEUE_TIMEOUT.name(), QUEUE_TIMEOUT_ALARM_KEYS); + ALARM_KEYS.put(LIVENESS, LIVENESS_ALARM_KEYS); + ALARM_KEYS.put(CAPACITY, CAPACITY_ALARM_KEYS); + ALARM_KEYS.put(REJECT, REJECT_ALARM_KEYS); + ALARM_KEYS.put(RUN_TIMEOUT, RUN_TIMEOUT_ALARM_KEYS); + ALARM_KEYS.put(QUEUE_TIMEOUT, QUEUE_TIMEOUT_ALARM_KEYS); ALL_ALARM_KEYS = ALARM_KEYS.values().stream().flatMap(Collection::stream).collect(Collectors.toSet()); ALL_ALARM_KEYS.addAll(COMMON_ALARM_KEYS); @@ -95,18 +92,18 @@ public class NotifyHelper { return ALL_ALARM_KEYS; } - public static Set getAlarmKeys(NotifyItemEnum notifyItemEnum) { - val keys = ALARM_KEYS.get(notifyItemEnum.name()); + public static Set getAlarmKeys(CommonNotifyItemType notifyItemType) { + val keys = ALARM_KEYS.get(notifyItemType.getType()); keys.addAll(COMMON_ALARM_KEYS); return keys; } - public static Optional getNotifyItem(ExecutorWrapper executor, NotifyItemEnum notifyType) { + public static Optional getNotifyItem(ExecutorWrapper executor, String notifyType) { if (CollectionUtils.isEmpty(executor.getNotifyItems())) { return Optional.empty(); } return executor.getNotifyItems().stream() - .filter(x -> notifyType.getValue().equalsIgnoreCase(x.getType())) + .filter(x -> notifyType.equalsIgnoreCase(x.getType())) .findFirst(); } @@ -136,7 +133,7 @@ public class NotifyHelper { } public static Map getAllPlatforms() { - val dtpProperties = ApplicationContextHolder.getBean(DtpProperties.class); + val dtpProperties = ContextManagerHelper.getBean(DtpProperties.class); if (CollectionUtils.isEmpty(dtpProperties.getPlatforms())) { return Collections.emptyMap(); } @@ -144,7 +141,7 @@ public class NotifyHelper { } public static void initNotify(DtpExecutor executor) { - val dtpProperties = ApplicationContextHolder.getBean(DtpProperties.class); + val dtpProperties = ContextManagerHelper.getBean(DtpProperties.class); val platforms = dtpProperties.getPlatforms(); if (CollectionUtils.isEmpty(platforms)) { executor.setNotifyItems(Lists.newArrayList()); @@ -197,10 +194,16 @@ public class NotifyHelper { Map oldNotifyItemMap = StreamUtil.toMap(oldNotifyItems, NotifyItem::getType); newNotifyItems.forEach(x -> { NotifyItem oldNotifyItem = oldNotifyItemMap.get(x.getType()); - if (Objects.nonNull(oldNotifyItem) && oldNotifyItem.getInterval() == x.getInterval()) { + if (Objects.isNull(oldNotifyItem)) { + AlarmManager.initAlarm(poolName, x); return; } - AlarmManager.initAlarm(poolName, x); + if (oldNotifyItem.getPeriod() != x.getPeriod()) { + AlarmManager.initAlarmCounter(poolName, x); + } + if (oldNotifyItem.getSilencePeriod() != x.getSilencePeriod()) { + AlarmManager.initAlarmLimiter(poolName, x); + } }); } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/refresher/AbstractRefresher.java b/core/src/main/java/org/dromara/dynamictp/core/refresher/AbstractRefresher.java index 6f34e4d22a65f6dbfdc360a7ef95fe8654f6f0e3..7896109c969f2df2a13914c5cf73688620976910 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/refresher/AbstractRefresher.java +++ b/core/src/main/java/org/dromara/dynamictp/core/refresher/AbstractRefresher.java @@ -25,18 +25,16 @@ import org.apache.commons.lang3.StringUtils; import org.dromara.dynamictp.common.em.ConfigFileTypeEnum; import org.dromara.dynamictp.common.event.RefreshEvent; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; import org.dromara.dynamictp.core.DtpRegistry; import org.dromara.dynamictp.core.handler.ConfigHandler; -import org.dromara.dynamictp.core.support.BinderHelper; -import org.springframework.context.EnvironmentAware; -import org.springframework.core.env.Environment; +import org.dromara.dynamictp.core.support.binder.BinderHelper; import java.io.IOException; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import org.dromara.dynamictp.common.manager.EventBusManager; import static org.dromara.dynamictp.common.constant.DynamicTpConst.MAIN_PROPERTIES_PREFIX; @@ -47,24 +45,16 @@ import static org.dromara.dynamictp.common.constant.DynamicTpConst.MAIN_PROPERTI * @since 1.0.0 **/ @Slf4j -public abstract class AbstractRefresher implements Refresher, EnvironmentAware { +public abstract class AbstractRefresher implements Refresher { protected final DtpProperties dtpProperties; - protected Environment environment; - protected AbstractRefresher(DtpProperties dtpProperties) { this.dtpProperties = dtpProperties; } - @Override - public void setEnvironment(Environment environment) { - this.environment = environment; - } - @Override public void refresh(String content, ConfigFileTypeEnum fileType) { - if (StringUtils.isBlank(content) || Objects.isNull(fileType)) { log.warn("DynamicTp refresh, empty content or null fileType."); return; @@ -88,7 +78,7 @@ public abstract class AbstractRefresher implements Refresher, EnvironmentAware { doRefresh(dtpProperties); } - protected void refresh(Environment environment) { + protected void refresh(Object environment) { BinderHelper.bindDtpProperties(environment, dtpProperties); doRefresh(dtpProperties); } @@ -110,6 +100,6 @@ public abstract class AbstractRefresher implements Refresher, EnvironmentAware { private void publishEvent(DtpProperties dtpProperties) { RefreshEvent event = new RefreshEvent(this, dtpProperties); - ApplicationContextHolder.publishEvent(event); + EventBusManager.post(event); } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/DtpBannerPrinter.java b/core/src/main/java/org/dromara/dynamictp/core/support/DtpBannerPrinter.java index c1f8b5f937e83fa9a6ee79c974a7d3649530345d..8e26cb6d26c420034316a6b08b45adb6411c25ac 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/DtpBannerPrinter.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/DtpBannerPrinter.java @@ -17,11 +17,13 @@ package org.dromara.dynamictp.core.support; +import com.google.common.eventbus.Subscribe; +import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.constant.DynamicTpConst; +import org.dromara.dynamictp.common.event.CustomContextRefreshedEvent; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; +import org.dromara.dynamictp.common.manager.EventBusManager; import org.dromara.dynamictp.common.util.VersionUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.EnvironmentAware; -import org.springframework.core.env.Environment; /** * DtpBannerPrinter related @@ -30,12 +32,16 @@ import org.springframework.core.env.Environment; * @since 1.0.0 **/ @Slf4j -public class DtpBannerPrinter implements EnvironmentAware { +public class DtpBannerPrinter { private static final String NAME = " :: Dynamic Thread Pool :: "; private static final String SITE = " :: https://dynamictp.cn ::"; + private static final String GITHUB_REPO = " :: https://github.com/dromara/dynamic-tp ::"; + + private static final String GITEE_REPO = " :: https://gitee.com/dromara/dynamic-tp ::"; + private static final String BANNER = "\n" + "| __ \\ (_) |__ __| \n" + "| | | |_ _ _ __ __ _ _ __ ___ _ ___| |_ __ \n" + @@ -45,12 +51,22 @@ public class DtpBannerPrinter implements EnvironmentAware { " __/ | | | \n" + " |___/ |_| "; - @Override - public void setEnvironment(Environment environment) { - boolean enable = environment.getProperty(DynamicTpConst.BANNER_ENABLED_PROP, - boolean.class, true); + public DtpBannerPrinter() { + EventBusManager.register(this); + } + + @Subscribe + public void onBannerPrintEvent(CustomContextRefreshedEvent event) { + printBanner(); + } + + public static void printBanner() { + boolean enable = Boolean.parseBoolean(ContextManagerHelper.getEnvironmentProperty(DynamicTpConst.BANNER_ENABLED_PROP, "true")); if (enable) { - log.info(BANNER + "\n" + NAME + "\n :: " + VersionUtil.getVersion() + " :: \n" + SITE + "\n"); + log.info(BANNER + "\n" + NAME + "\n :: {} :: \n" + SITE + "\n" + GITHUB_REPO + "\n" + GITEE_REPO, + VersionUtil.getVersion()); } } } + + diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/DtpLifecycleSupport.java b/core/src/main/java/org/dromara/dynamictp/core/support/DtpLifecycleSupport.java index 20ad0baaeaa59b55d2169424ab38a2d72a03f0a4..1ced53014ec1c90445497fe775b4d96aa967c71d 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/DtpLifecycleSupport.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/DtpLifecycleSupport.java @@ -18,8 +18,6 @@ package org.dromara.dynamictp.core.support; import lombok.extern.slf4j.Slf4j; -import org.dromara.dynamictp.core.executor.DtpExecutor; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.Objects; import java.util.concurrent.ExecutorService; @@ -29,8 +27,7 @@ import java.util.concurrent.RunnableFuture; import java.util.concurrent.TimeUnit; /** - * DtpLifecycleSupport which mainly implements Spring bean's lifecycle management, - * mimics spring internal thread pool {@link ThreadPoolTaskExecutor}. + * DtpLifecycleSupport which mainly implements ThreadPoolExecutor's lifecycle management. * * @author yanhom * @since 1.0.3 @@ -55,23 +52,15 @@ public class DtpLifecycleSupport { * @param executorWrapper executor wrapper */ public static void destroy(ExecutorWrapper executorWrapper) { - if (executorWrapper.isDtpExecutor()) { - destroy((DtpExecutor) executorWrapper.getExecutor()); - } else if (executorWrapper.isThreadPoolExecutor()) { - internalShutdown(((ThreadPoolExecutorAdapter) executorWrapper.getExecutor()).getOriginal(), + if (executorWrapper.isExecutorService()) { + ExecutorService executorService = (ExecutorService) executorWrapper.getExecutor().getOriginal(); + internalShutdown(executorService, executorWrapper.getThreadPoolName(), - true, - 0); + executorWrapper.isWaitForTasksToCompleteOnShutdown(), + executorWrapper.getAwaitTerminationSeconds()); } } - public static void destroy(DtpExecutor executor) { - internalShutdown(executor, - executor.getThreadPoolName(), - executor.isWaitForTasksToCompleteOnShutdown(), - executor.getAwaitTerminationSeconds()); - } - public static void shutdownGracefulAsync(ExecutorService executor, String threadPoolName, int timeout) { diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/ExecutorWrapper.java b/core/src/main/java/org/dromara/dynamictp/core/support/ExecutorWrapper.java index 2b8745ff720f9263da1de96c5c76149facaea000..eb21d06ecd7f33f4e697fdcff5465102db4546ed 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/ExecutorWrapper.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/ExecutorWrapper.java @@ -17,21 +17,27 @@ package org.dromara.dynamictp.core.support; -import com.google.common.collect.Sets; +import cn.hutool.core.bean.BeanUtil; import lombok.Data; -import org.dromara.dynamictp.common.em.NotifyItemEnum; import org.dromara.dynamictp.common.entity.NotifyItem; import org.dromara.dynamictp.core.aware.AwareManager; +import org.dromara.dynamictp.core.aware.RejectHandlerAware; import org.dromara.dynamictp.core.aware.TaskEnhanceAware; import org.dromara.dynamictp.core.executor.DtpExecutor; import org.dromara.dynamictp.core.notifier.capture.CapturedExecutor; import org.dromara.dynamictp.core.notifier.manager.AlarmManager; +import org.dromara.dynamictp.core.reject.RejectHandlerGetter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ThreadPoolExecutorAdapter; import org.dromara.dynamictp.core.support.task.wrapper.TaskWrapper; -import org.springframework.beans.BeanUtils; +import org.dromara.dynamictp.common.notifier.type.NotifyItemTypeRegistry; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; /** @@ -59,7 +65,7 @@ public class ExecutorWrapper { private ExecutorAdapter executor; /** - * Notify items, see {@link NotifyItemEnum}. + * Notify items, see {@link NotifyItemTypeRegistry}. */ private List notifyItems; @@ -74,14 +80,32 @@ public class ExecutorWrapper { private boolean notifyEnabled = true; /** - * Thread pool stat provider + * If enhance reject. */ - private ThreadPoolStatProvider threadPoolStatProvider; + private boolean rejectEnhanced = true; /** * Aware names */ - private Set awareNames = Sets.newHashSet(); + private Set awareNames = new HashSet<>(); + + /** + * Whether to wait for scheduled tasks to complete on shutdown, + * not interrupting running tasks and executing all tasks in the queue. + */ + protected boolean waitForTasksToCompleteOnShutdown = false; + + /** + * The maximum number of seconds that this executor is supposed to block + * on shutdown in order to wait for remaining tasks to complete their execution + * before the rest of the container continues to shut down. + */ + protected int awaitTerminationSeconds = 0; + + /** + * Thread pool stat provider + */ + private ThreadPoolStatProvider threadPoolStatProvider; private ExecutorWrapper() { } @@ -92,13 +116,16 @@ public class ExecutorWrapper { * @param executor the DtpExecutor */ public ExecutorWrapper(DtpExecutor executor) { + this.executor = executor; this.threadPoolName = executor.getThreadPoolName(); this.threadPoolAliasName = executor.getThreadPoolAliasName(); - this.executor = executor; this.notifyItems = executor.getNotifyItems(); this.notifyEnabled = executor.isNotifyEnabled(); this.platformIds = executor.getPlatformIds(); this.awareNames = executor.getAwareNames(); + this.rejectEnhanced = executor.isRejectEnhanced(); + this.waitForTasksToCompleteOnShutdown = executor.isWaitForTasksToCompleteOnShutdown(); + this.awaitTerminationSeconds = executor.getAwaitTerminationSeconds(); this.threadPoolStatProvider = ThreadPoolStatProvider.of(this); } @@ -139,18 +166,16 @@ public class ExecutorWrapper { */ public ExecutorWrapper capture() { ExecutorWrapper executorWrapper = new ExecutorWrapper(); - BeanUtils.copyProperties(this, executorWrapper); - executorWrapper.executor = new CapturedExecutor(this.getExecutor()); + BeanUtil.copyProperties(this, executorWrapper); + executorWrapper.setExecutor(new CapturedExecutor(this.getExecutor())); return executorWrapper; } - /** * Initialize. */ public void initialize() { if (isDtpExecutor()) { - DtpExecutor dtpExecutor = (DtpExecutor) getExecutor(); - dtpExecutor.initialize(); + ((DtpExecutor) getExecutor()).initialize(); AwareManager.register(this); } else if (isThreadPoolExecutor()) { AwareManager.register(this); @@ -166,6 +191,10 @@ public class ExecutorWrapper { return this.executor instanceof DtpExecutor; } + public boolean isExecutorService() { + return this.executor.getOriginal() instanceof ExecutorService; + } + /** * whether is ThreadPoolExecutor * @@ -185,4 +214,16 @@ public class ExecutorWrapper { ((TaskEnhanceAware) executor.getOriginal()).setTaskWrappers(taskWrappers); } } + + public void setRejectHandler(RejectedExecutionHandler handler) { + String rejectHandlerType = handler.getClass().getSimpleName(); + if (executor.getOriginal() instanceof RejectHandlerAware) { + ((RejectHandlerAware) executor.getOriginal()).setRejectHandlerType(rejectHandlerType); + } + if (isRejectEnhanced()) { + executor.setRejectedExecutionHandler(RejectHandlerGetter.getProxy(handler)); + } else { + executor.setRejectedExecutionHandler(handler); + } + } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolBuilder.java b/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolBuilder.java index 5465a69e740e18a42d2d2008dbb2afea81719c34..b7331604c23ad34ae6451984fe7dcc642f70b8fb 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolBuilder.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolBuilder.java @@ -19,11 +19,11 @@ package org.dromara.dynamictp.core.support; import com.alibaba.ttl.TtlRunnable; import com.alibaba.ttl.threadpool.TtlExecutors; +import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.dromara.dynamictp.common.constant.DynamicTpConst; -import org.dromara.dynamictp.common.em.NotifyItemEnum; import org.dromara.dynamictp.common.em.QueueTypeEnum; import org.dromara.dynamictp.common.em.RejectedTypeEnum; import org.dromara.dynamictp.common.entity.NotifyItem; @@ -37,7 +37,7 @@ import org.dromara.dynamictp.core.executor.eager.TaskQueue; import org.dromara.dynamictp.core.executor.priority.PriorityDtpExecutor; import org.dromara.dynamictp.core.reject.RejectHandlerGetter; import org.dromara.dynamictp.core.support.task.wrapper.TaskWrapper; -import org.springframework.util.Assert; +import org.dromara.dynamictp.common.notifier.type.NotifyItemTypeRegistry; import java.util.List; import java.util.Objects; @@ -178,7 +178,7 @@ public class ThreadPoolBuilder { private long runTimeout = 0; /** - * If try interrupt thread when run timeout. + * If try interrupt thread when task run timeout. */ private boolean tryInterrupt = false; @@ -193,7 +193,7 @@ public class ThreadPoolBuilder { private final List taskWrappers = Lists.newArrayList(); /** - * Notify items, see {@link NotifyItemEnum} + * Notify items, see {@link NotifyItemTypeRegistry} */ private List notifyItems = NotifyItem.getAllNotifyItems(); @@ -578,7 +578,7 @@ public class ThreadPoolBuilder { * @return the newly created DtpExecutor instance */ private DtpExecutor buildDtpExecutor(ThreadPoolBuilder builder) { - Assert.notNull(builder.threadPoolName, "The thread pool name must not be null."); + Preconditions.checkNotNull(builder.threadPoolName, "The thread pool name must not be null."); DtpExecutor dtpExecutor = createInternal(builder); dtpExecutor.setThreadPoolName(builder.threadPoolName); dtpExecutor.allowCoreThreadTimeOut(builder.allowCoreThreadTimeOut); diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolStatProvider.java b/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolStatProvider.java index 05c782435e9cb4ee11b9bf43b44dd9cd6a226723..668ffad06f08ba976e68c36b76f6ffd8529ab3b6 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolStatProvider.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolStatProvider.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.core.support; import lombok.val; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; import org.dromara.dynamictp.common.timer.HashedWheelTimer; import org.dromara.dynamictp.common.timer.Timeout; import org.dromara.dynamictp.core.executor.DtpExecutor; @@ -100,7 +100,7 @@ public class ThreadPoolStatProvider { public static ThreadPoolStatProvider of(ExecutorWrapper executorWrapper) { val provider = new ThreadPoolStatProvider(executorWrapper); if (executorWrapper.isDtpExecutor()) { - val dtpExecutor = (DtpExecutor) executorWrapper.getExecutor(); + DtpExecutor dtpExecutor = (DtpExecutor) executorWrapper.getExecutor(); provider.setRunTimeout(dtpExecutor.getRunTimeout()); provider.setQueueTimeout(dtpExecutor.getQueueTimeout()); provider.setTryInterrupt(dtpExecutor.isTryInterrupt()); @@ -164,7 +164,7 @@ public class ThreadPoolStatProvider { if (queueTimeout <= 0) { return; } - HashedWheelTimer timer = ApplicationContextHolder.getBean(HashedWheelTimer.class); + HashedWheelTimer timer = ContextManagerHelper.getBean(HashedWheelTimer.class); QueueTimeoutTimerTask timerTask = new QueueTimeoutTimerTask(executorWrapper, r); queueTimeoutMap.put(r, new SoftReference<>(timer.newTimeout(timerTask, queueTimeout, TimeUnit.MILLISECONDS))); } @@ -179,7 +179,7 @@ public class ThreadPoolStatProvider { if (runTimeout <= 0) { return; } - HashedWheelTimer timer = ApplicationContextHolder.getBean(HashedWheelTimer.class); + HashedWheelTimer timer = ContextManagerHelper.getBean(HashedWheelTimer.class); RunTimeoutTimerTask timerTask = new RunTimeoutTimerTask(executorWrapper, r, t); runTimeoutMap.put(r, new SoftReference<>(timer.newTimeout(timerTask, runTimeout, TimeUnit.MILLISECONDS))); } diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/ExecutorAdapter.java b/core/src/main/java/org/dromara/dynamictp/core/support/adapter/ExecutorAdapter.java similarity index 97% rename from core/src/main/java/org/dromara/dynamictp/core/support/ExecutorAdapter.java rename to core/src/main/java/org/dromara/dynamictp/core/support/adapter/ExecutorAdapter.java index 39529ea807a8d26e088452335e29fa2f1c2eeeea..cca52fc26dc150925652148b9a84bdd85349cb5e 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/ExecutorAdapter.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/adapter/ExecutorAdapter.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.support; +package org.dromara.dynamictp.core.support.adapter; import java.util.AbstractQueue; import java.util.Collection; @@ -229,6 +229,13 @@ public interface ExecutorAdapter extends Executor { //default unsupported } + /** + * Pre start all core threads + */ + default void preStartAllCoreThreads() { + //default unsupported + } + /** * Get the keep alive time * diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolExecutorAdapter.java b/core/src/main/java/org/dromara/dynamictp/core/support/adapter/ThreadPoolExecutorAdapter.java similarity index 96% rename from core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolExecutorAdapter.java rename to core/src/main/java/org/dromara/dynamictp/core/support/adapter/ThreadPoolExecutorAdapter.java index 815f4109b906148bea3fed2e0757ff988ccbaa0c..de6f1e0f2e463defff9a1d5f1e9c077438554f98 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolExecutorAdapter.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/adapter/ThreadPoolExecutorAdapter.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.support; +package org.dromara.dynamictp.core.support.adapter; import org.dromara.dynamictp.core.aware.RejectHandlerAware; @@ -126,7 +126,12 @@ public class ThreadPoolExecutorAdapter implements ExecutorAdapter properties, DtpProperties dtpProperties) { final PropertiesBinder binder = getBinder(); if (Objects.isNull(binder)) { @@ -59,8 +57,8 @@ public class BinderHelper { } binder.bindDtpProperties(properties, dtpProperties); } - - public static void bindDtpProperties(Environment environment, DtpProperties dtpProperties) { + + public static void bindDtpProperties(Object environment, DtpProperties dtpProperties) { final PropertiesBinder binder = getBinder(); if (Objects.isNull(binder)) { return; diff --git a/core/src/main/java/org/dromara/dynamictp/core/spring/PropertiesBinder.java b/core/src/main/java/org/dromara/dynamictp/core/support/binder/PropertiesBinder.java similarity index 72% rename from core/src/main/java/org/dromara/dynamictp/core/spring/PropertiesBinder.java rename to core/src/main/java/org/dromara/dynamictp/core/support/binder/PropertiesBinder.java index 75e97dcb66ea6ef9815588dda57cd198d1430c2a..9b6c98c2a06c84a1f8b71e2a50e1226cddbe9b4d 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/spring/PropertiesBinder.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/binder/PropertiesBinder.java @@ -15,10 +15,9 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.spring; +package org.dromara.dynamictp.core.support.binder; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.springframework.core.env.Environment; import java.util.Map; @@ -44,5 +43,25 @@ public interface PropertiesBinder { * @param environment environment * @param dtpProperties dtp properties */ - void bindDtpProperties(Environment environment, DtpProperties dtpProperties); + void bindDtpProperties(Object environment, DtpProperties dtpProperties); + + /** + * before bind + * + * @param source source + * @param dtpProperties dtp properties + */ + default void beforeBind(Object source, DtpProperties dtpProperties) { + + } + + /** + * after bind + * + * @param source source + * @param dtpProperties dtp properties + */ + default void afterBind(Object source, DtpProperties dtpProperties) { + + } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/init/DtpInitializer.java b/core/src/main/java/org/dromara/dynamictp/core/support/init/DtpInitializer.java index da835f8a208014b1cc8a495f45bbe2c8bd1b66b5..1c4d0634ddac915442fbcbdee59b67b72c92955c 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/init/DtpInitializer.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/init/DtpInitializer.java @@ -43,6 +43,8 @@ public interface DtpInitializer { /** * Init. + * + * @param args args */ - void init(); + void init(Object... args); } diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/init/DtpInitializerExecutor.java b/core/src/main/java/org/dromara/dynamictp/core/support/init/DtpInitializerExecutor.java index 54fdecaff5b052fe946c5da0d9adbdc7762a1bd1..5bd2b66e307f775b9aefff84a3feb2ca4c399594 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/init/DtpInitializerExecutor.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/init/DtpInitializerExecutor.java @@ -34,7 +34,7 @@ public class DtpInitializerExecutor { private static final AtomicBoolean INITIALIZED = new AtomicBoolean(false); - public static void init() { + public static void init(Object... args) { if (!INITIALIZED.compareAndSet(false, true)) { return; } @@ -43,6 +43,6 @@ public class DtpInitializerExecutor { return; } loadedInitializers.sort(Comparator.comparingInt(DtpInitializer::getOrder)); - loadedInitializers.forEach(DtpInitializer::init); + loadedInitializers.forEach(i -> i.init(args)); } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/ScheduledThreadPoolExecutorProxy.java b/core/src/main/java/org/dromara/dynamictp/core/support/proxy/ScheduledThreadPoolExecutorProxy.java similarity index 65% rename from core/src/main/java/org/dromara/dynamictp/core/support/ScheduledThreadPoolExecutorProxy.java rename to core/src/main/java/org/dromara/dynamictp/core/support/proxy/ScheduledThreadPoolExecutorProxy.java index 0d30c14d8acb5db99e044fc2e1037a8349812791..aec246a42ed2b85838a6d472044d9a3afc5d4752 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/ScheduledThreadPoolExecutorProxy.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/proxy/ScheduledThreadPoolExecutorProxy.java @@ -15,15 +15,20 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.support; +package org.dromara.dynamictp.core.support.proxy; +import org.dromara.dynamictp.common.util.ExecutorUtil; import org.dromara.dynamictp.core.aware.AwareManager; import org.dromara.dynamictp.core.aware.RejectHandlerAware; import org.dromara.dynamictp.core.aware.TaskEnhanceAware; import org.dromara.dynamictp.core.reject.RejectHandlerGetter; import org.dromara.dynamictp.core.support.task.wrapper.TaskWrapper; + import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * ScheduledThreadPoolExecutorProxy related @@ -42,31 +47,54 @@ public class ScheduledThreadPoolExecutorProxy extends ScheduledThreadPoolExecuto /** * Reject handler type. */ - private final String rejectHandlerType; + private String rejectHandlerType; public ScheduledThreadPoolExecutorProxy(ScheduledThreadPoolExecutor executor) { super(executor.getCorePoolSize(), executor.getThreadFactory()); this.rejectHandlerType = executor.getRejectedExecutionHandler().getClass().getSimpleName(); - setRejectedExecutionHandler(RejectHandlerGetter.getProxy(getRejectedExecutionHandler())); + setRejectedExecutionHandler(RejectHandlerGetter.getProxy(executor.getRejectedExecutionHandler())); } @Override public void execute(Runnable command) { command = getEnhancedTask(command); - AwareManager.execute(this, command); super.execute(command); } + @Override + public ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit) { + command = getEnhancedTask(command); + return super.schedule(command, delay, unit); + } + + public ScheduledFuture schedule(Runnable command, V result, long delay, TimeUnit unit) { + command = getEnhancedTask(command); + return super.schedule(Executors.callable(command, result), delay, unit); + } + + @Override + public ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { + command = getEnhancedTask(command); + return super.scheduleAtFixedRate(command, initialDelay, period, unit); + } + + @Override + public ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) { + command = getEnhancedTask(command); + return super.scheduleWithFixedDelay(command, initialDelay, delay, unit); + } + @Override protected void beforeExecute(Thread t, Runnable r) { - super.beforeExecute(t, r); AwareManager.beforeExecute(this, t, r); + super.beforeExecute(t, r); } @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); AwareManager.afterExecute(this, r, t); + ExecutorUtil.tryExecAfterExecute(r, t); } @Override @@ -74,6 +102,11 @@ public class ScheduledThreadPoolExecutorProxy extends ScheduledThreadPoolExecuto return rejectHandlerType; } + @Override + public void setRejectHandlerType(String rejectHandlerType) { + this.rejectHandlerType = rejectHandlerType; + } + @Override public List getTaskWrappers() { return taskWrappers; diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolExecutorProxy.java b/core/src/main/java/org/dromara/dynamictp/core/support/proxy/ThreadPoolExecutorProxy.java similarity index 88% rename from core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolExecutorProxy.java rename to core/src/main/java/org/dromara/dynamictp/core/support/proxy/ThreadPoolExecutorProxy.java index 00396b077dcf356a38459cfb1905ad9be140a2b7..1fdcea46a06d52b5e30b9ea71575c20157b5d05c 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolExecutorProxy.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/proxy/ThreadPoolExecutorProxy.java @@ -15,8 +15,9 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.support; +package org.dromara.dynamictp.core.support.proxy; +import org.dromara.dynamictp.common.util.ExecutorUtil; import org.dromara.dynamictp.core.aware.AwareManager; import org.dromara.dynamictp.core.aware.RejectHandlerAware; import org.dromara.dynamictp.core.aware.TaskEnhanceAware; @@ -43,13 +44,14 @@ public class ThreadPoolExecutorProxy extends ThreadPoolExecutor implements TaskE /** * Reject handler type. */ - private final String rejectHandlerType; + private String rejectHandlerType; public ThreadPoolExecutorProxy(ThreadPoolExecutor executor) { super(executor.getCorePoolSize(), executor.getMaximumPoolSize(), executor.getKeepAliveTime(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS, executor.getQueue(), executor.getThreadFactory(), executor.getRejectedExecutionHandler()); + allowCoreThreadTimeOut(executor.allowsCoreThreadTimeOut()); this.rejectHandlerType = getRejectedExecutionHandler().getClass().getSimpleName(); setRejectedExecutionHandler(RejectHandlerGetter.getProxy(getRejectedExecutionHandler())); } @@ -63,14 +65,15 @@ public class ThreadPoolExecutorProxy extends ThreadPoolExecutor implements TaskE @Override protected void beforeExecute(Thread t, Runnable r) { - super.beforeExecute(t, r); AwareManager.beforeExecute(this, t, r); + super.beforeExecute(t, r); } @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); AwareManager.afterExecute(this, r, t); + ExecutorUtil.tryExecAfterExecute(r, t); } @Override @@ -87,4 +90,9 @@ public class ThreadPoolExecutorProxy extends ThreadPoolExecutor implements TaskE public String getRejectHandlerType() { return rejectHandlerType; } + + @Override + public void setRejectHandlerType(String rejectHandlerType) { + this.rejectHandlerType = rejectHandlerType; + } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/task/runnable/EnhancedRunnable.java b/core/src/main/java/org/dromara/dynamictp/core/support/task/runnable/EnhancedRunnable.java index 855c84e6a402b5682bb920933a5dc11604d17a85..8445d7cb37862b11c0ae28f9cfdad7b7660cda56 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/task/runnable/EnhancedRunnable.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/task/runnable/EnhancedRunnable.java @@ -18,6 +18,7 @@ package org.dromara.dynamictp.core.support.task.runnable; import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.common.util.ExecutorUtil; import org.dromara.dynamictp.core.aware.AwareManager; import java.util.Objects; import java.util.concurrent.Executor; @@ -49,7 +50,7 @@ public class EnhancedRunnable implements Runnable { if (Objects.isNull(runnable)) { return; } - AwareManager.beforeExecute(executor, Thread.currentThread(), this); + AwareManager.beforeExecute(executor, Thread.currentThread(), runnable); Throwable t = null; try { runnable.run(); @@ -57,7 +58,8 @@ public class EnhancedRunnable implements Runnable { t = e; throw e; } finally { - AwareManager.afterExecute(executor, this, t); + AwareManager.afterExecute(executor, runnable, t); + ExecutorUtil.tryExecAfterExecute(runnable, t); } } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/task/wrapper/TaskWrappers.java b/core/src/main/java/org/dromara/dynamictp/core/support/task/wrapper/TaskWrappers.java index b9b35759b0ec6f2c78194655d55ef3610b537b6e..c94743f10566321d3deca6a74be65cea0c9f3955 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/task/wrapper/TaskWrappers.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/task/wrapper/TaskWrappers.java @@ -25,6 +25,7 @@ import org.dromara.dynamictp.common.util.StringUtil; import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; @@ -56,6 +57,14 @@ public class TaskWrappers { return TASK_WRAPPERS.stream().filter(t -> StringUtil.containsIgnoreCase(t.name(), names)).collect(toList()); } + public static void register(TaskWrapper taskWrapper) { + Set names = TASK_WRAPPERS.stream().map(TaskWrapper::name).collect(Collectors.toSet()); + if (names.contains(taskWrapper.name())) { + return; + } + TASK_WRAPPERS.add(taskWrapper); + } + public static TaskWrappers getInstance() { return TaskWrappersHolder.INSTANCE; } diff --git a/core/src/main/java/org/dromara/dynamictp/core/system/SystemMetricManager.java b/core/src/main/java/org/dromara/dynamictp/core/system/SystemMetricManager.java index 3b87df63b30a2a56c9a9be7f51b86362d74e6f10..4f61b6dcbc87534b058f8e199e213e08af12d6f7 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/system/SystemMetricManager.java +++ b/core/src/main/java/org/dromara/dynamictp/core/system/SystemMetricManager.java @@ -64,7 +64,7 @@ public class SystemMetricManager { return MEMORY_METRICS_CAPTOR.getLongLivedMemoryUsage(); } - public static void stop() { + public static void destroy() { EXECUTOR.shutdown(); } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/timer/QueueTimeoutTimerTask.java b/core/src/main/java/org/dromara/dynamictp/core/timer/QueueTimeoutTimerTask.java index 2a20626c63390d163c9fd7cef9e730a5fe310a0a..16c4bb0c4c2712ad3b545ca3a43986c156b9101a 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/timer/QueueTimeoutTimerTask.java +++ b/core/src/main/java/org/dromara/dynamictp/core/timer/QueueTimeoutTimerTask.java @@ -21,10 +21,10 @@ import cn.hutool.core.text.CharSequenceUtil; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.dromara.dynamictp.core.notifier.manager.AlarmManager; -import org.dromara.dynamictp.core.support.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import org.dromara.dynamictp.core.support.ExecutorWrapper; -import static org.dromara.dynamictp.common.em.NotifyItemEnum.QUEUE_TIMEOUT; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.QUEUE_TIMEOUT; /** * A timer task used to handle queued timeout. diff --git a/core/src/main/java/org/dromara/dynamictp/core/timer/RunTimeoutTimerTask.java b/core/src/main/java/org/dromara/dynamictp/core/timer/RunTimeoutTimerTask.java index 70d759bcee7f411eecec6b951cce025bce4f7857..401f41a825c538e2973914d0e9fbdfa9d22c227b 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/timer/RunTimeoutTimerTask.java +++ b/core/src/main/java/org/dromara/dynamictp/core/timer/RunTimeoutTimerTask.java @@ -21,10 +21,10 @@ import cn.hutool.core.text.CharSequenceUtil; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.dromara.dynamictp.core.notifier.manager.AlarmManager; -import org.dromara.dynamictp.core.support.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import org.dromara.dynamictp.core.support.ExecutorWrapper; -import static org.dromara.dynamictp.common.em.NotifyItemEnum.RUN_TIMEOUT; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.RUN_TIMEOUT; /** * A timer task used to handle run timeout. diff --git a/dependencies/pom.xml b/dependencies/pom.xml index ba00b1c4eb7951dde71fa0fa06e7b157a9a3a799..92aacd4f7b80df7fec178128823e17b43920069c 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -4,7 +4,7 @@ org.dromara.dynamictp dynamic-tp-dependencies - ${revision} + 1.2.1 pom dynamic-tp-dependencies @@ -12,7 +12,7 @@ https://github.com/yanhom1314/dynamic-tp - 1.1.8-beta + 1.2.1 UTF-8 1.18.24 @@ -22,19 +22,20 @@ 5.8.25 31.1-jre - 2.13.4 - 2.13.4 + 2.13.5 2.8.9 1.2.83 + 2.14.3 1.0.4 - 5.9.1 + 5.12.0 + 2.12.3 2022.2.0 - 3.0.7 - 2.6.0 + 3.0.14 + 2.6.10 2.0.0 - 2.13.1.RELEASE + 2.15.0.RELEASE 1.5.18 1.2.0 3.14.9 @@ -42,11 +43,12 @@ 4.9.3 1.8.8.8.Final - 1.7.2 - 8.11.0 + 1.7.3 + 9.1.0 1.25.0 + 0.21.0 - 1.5.0 + 2.0.0 2.0.4 0.2.12 2021.0.5.0 @@ -54,14 +56,16 @@ 1.10.11-2021.0.x 5.2.1 - 1.3.0 + 1.7.0 2.4 3.2.0 1.6 + 0.6.0 4.2.20 - 1.35 + 1.36 2.0.2 + 1.17.5 @@ -104,7 +108,7 @@ net.devh - grpc-server-spring-boot-starter + grpc-spring-boot-starter ${grpc-starter.version} @@ -159,13 +163,13 @@ com.fasterxml.jackson.core jackson-core - ${jackson-core.version} + ${jackson.version} com.fasterxml.jackson.core jackson-databind - ${jackson-databind.version} + ${jackson.version} @@ -226,6 +230,12 @@ ${sofa-rpc.version} + + com.yomahub + liteflow-core + ${liteflow.version} + + com.ctrip.framework.apollo apollo-client @@ -254,14 +264,12 @@ org.openjdk.jmh jmh-core ${jmh.version} - test org.openjdk.jmh jmh-generator-annprocess ${jmh.version} - test @@ -324,260 +332,301 @@ ${dropwizard-metrics.version} + + + net.bytebuddy + byte-buddy + ${bytebuddy.version} + + + + org.apache.thrift + libthrift + ${thrift.version} + + org.dromara.dynamictp dynamic-tp-jvmti-runtime - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-adapter - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-common - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-core - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-logging - ${revision} + 1.2.1 + + + + org.dromara.dynamictp + dynamic-tp-spring + 1.2.1 org.dromara.dynamictp dynamic-tp-adapter-common - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-adapter-dubbo - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-adapter-rocketmq - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-adapter-rabbitmq - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-adapter-hystrix - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-adapter-grpc - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-adapter-motan - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-adapter-okhttp3 - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-adapter-brpc - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-adapter-tars - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-adapter-sofa - ${revision} + 1.2.1 + + + + org.dromara.dynamictp + dynamic-tp-adapter-liteflow + 1.2.1 + + + + org.dromara.dynamictp + dynamic-tp-adapter-thrift + 1.2.1 org.dromara.dynamictp dynamic-tp-extension-limiter-redis - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-extension-agent - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-extension-notify-email - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-extension-notify-yunzhijia - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-extension-skywalking - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-common - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-common - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-webserver - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-apollo - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-zookeeper - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-cloud-starter-zookeeper - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-cloud-starter-consul - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-etcd - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-cloud-starter-polaris - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-cloud-starter-huawei - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-nacos - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-cloud-starter-nacos - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-dubbo - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-rocketmq - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-hystrix - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-extension-limiter-redis - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-extension-notify-email - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-extension-notify-yunzhijia - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-okhttp3 - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-grpc - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-brpc - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-motan - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-tars - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-sofa - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-rabbitmq - ${revision} + 1.2.1 + + + org.dromara.dynamictp + dynamic-tp-spring-boot-starter-adapter-liteflow + 1.2.1 + + + org.dromara.dynamictp + dynamic-tp-spring-boot-starter-adapter-thrift + 1.2.1 @@ -633,6 +682,7 @@ + attach-sources package jar-no-fork @@ -647,7 +697,8 @@ ${maven-javadoc-plugin.version} - package + attach-javadocs + package jar @@ -670,6 +721,17 @@ + + + + + + + + + + + org.sonatype.plugins nexus-staging-maven-plugin @@ -683,31 +745,31 @@ - - org.codehaus.mojo - flatten-maven-plugin - ${maven-flatten.version} - - true - resolveCiFriendliesOnly - - - - flatten - process-resources - - flatten - - - - flatten.clean - clean - - clean - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/example-adapter/example-adapter-brpc/pom.xml b/example/example-adapter/example-adapter-brpc/pom.xml index 8a3622be6ea2c0677407c3c2f10c1f37d24a7307..210b0a4b20310053e003f444c96ca2e297d2ff96 100644 --- a/example/example-adapter/example-adapter-brpc/pom.xml +++ b/example/example-adapter/example-adapter-brpc/pom.xml @@ -5,7 +5,7 @@ dynamic-tp-example-adapter org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter-brpc @@ -29,7 +29,7 @@ org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-brpc - ${revision} + 1.2.1 diff --git a/example/example-adapter/example-adapter-brpc/src/main/java/org/dromara/dynamictp/example/BrpcExampleApplication.java b/example/example-adapter/example-adapter-brpc/src/main/java/org/dromara/dynamictp/example/BrpcExampleApplication.java index c4acc712ebd42f0feab00f4a15904613ae82a4c3..2aeb7e6d529a8cb041bf41f65d1d37cc9b50bc63 100644 --- a/example/example-adapter/example-adapter-brpc/src/main/java/org/dromara/dynamictp/example/BrpcExampleApplication.java +++ b/example/example-adapter/example-adapter-brpc/src/main/java/org/dromara/dynamictp/example/BrpcExampleApplication.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.example; import com.baidu.cloud.starlight.springcloud.server.annotation.StarlightScan; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/example/example-adapter/example-adapter-brpc/src/main/resources/application.yml b/example/example-adapter/example-adapter-brpc/src/main/resources/application.yml index 3e3c4a1b6be6910d6b5215951d804598d0a0b844..b5137e7cfea4ebfd5e4e05ecf79ebe273aa1373e 100644 --- a/example/example-adapter/example-adapter-brpc/src/main/resources/application.yml +++ b/example/example-adapter/example-adapter-brpc/src/main/resources/application.yml @@ -7,28 +7,27 @@ spring: profiles: active: dev - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: micrometer # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - brpcTp: # brpc 线程池配置 - - threadPoolName: rpc#server # 名称规则:biz_thread_pool_name + "#" + client/server - corePoolSize: 100 - maximumPoolSize: 200 - keepAliveTime: 60 +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: micrometer # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + brpcTp: # brpc 线程池配置 + - threadPoolName: rpc#server # 名称规则:biz_thread_pool_name + "#" + client/server + corePoolSize: 100 + maximumPoolSize: 200 + keepAliveTime: 60 starlight: server: diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-alibaba-dubbo/pom.xml b/example/example-adapter/example-adapter-dubbo/example-adapter-alibaba-dubbo/pom.xml index a44cb9919c2369c37923bf0a20fc6b9222dc10ff..ebaf20d84d7a011e7cf253ae1c661daa7125c519 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-alibaba-dubbo/pom.xml +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-alibaba-dubbo/pom.xml @@ -6,7 +6,7 @@ dynamic-tp-example-adapter-dubbo org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter-alibaba-dubbo @@ -20,7 +20,7 @@ com.101tec zkclient - 0.10 + 0.11 slf4j-reload4j diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-alibaba-dubbo/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java b/example/example-adapter/example-adapter-dubbo/example-adapter-alibaba-dubbo/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java index d236f57efb91ac8cbb4e3e200b784a734f580358..ec79d2c011087f376a32b99ba9822a52d27e4183 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-alibaba-dubbo/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-alibaba-dubbo/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java @@ -18,15 +18,15 @@ package org.dromara.dynamictp.example; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author dragon-zhang */ -@EnableDubbo @EnableDynamicTp +@EnableDubbo @SpringBootApplication public class DubboExampleApplication { public static void main(String[] args) { diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-alibaba-dubbo/src/main/resources/application.yml b/example/example-adapter/example-adapter-dubbo/example-adapter-alibaba-dubbo/src/main/resources/application.yml index 9c39fb9db1bb88e88a0937202c750bf3e36e6848..60070116a831c077e36a12be725c3987074b6f0e 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-alibaba-dubbo/src/main/resources/application.yml +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-alibaba-dubbo/src/main/resources/application.yml @@ -7,29 +7,28 @@ spring: profiles: active: dev - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - dubboTp: # dubbo 线程池配置 - - threadPoolName: dubboTp#20880 # 名称规则:dubboTp + "#" + 协议端口 - threadPoolAliasName: 测试线程池 - corePoolSize: 100 - maximumPoolSize: 200 - keepAliveTime: 60 +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + dubboTp: # dubbo 线程池配置 + - threadPoolName: dubboTp#20880 # 名称规则:dubboTp + "#" + 协议端口 + threadPoolAliasName: 测试线程池 + corePoolSize: 100 + maximumPoolSize: 200 + keepAliveTime: 60 dubbo: application: diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.3/pom.xml b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.3/pom.xml index b9e46f0c6373d64e767e8ab274c271a513d90ccc..4875c98ca0b3dd51198f949a00566ca23595201b 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.3/pom.xml +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.3/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-example-adapter-apache-dubbo - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter-apache-dubbo-2.7.3 diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.3/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.3/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java index 19299a668bd058d561d27b58a79276588866993e..c3572760bdd552cf0c8b3d4b70f0bd48e23b13ff 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.3/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.3/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java @@ -17,16 +17,16 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author dragon-zhang */ -@EnableDubbo @EnableDynamicTp +@EnableDubbo @SpringBootApplication public class DubboExampleApplication { public static void main(String[] args) { diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.3/src/main/resources/application.yml b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.3/src/main/resources/application.yml index 7cb1f62e8d2042ec64c7c1bbdcaf67364a5f778e..ad48d6b2f98738cff87f5c6c802b2f0caf52f10e 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.3/src/main/resources/application.yml +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.3/src/main/resources/application.yml @@ -7,35 +7,34 @@ spring: profiles: active: dev - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - dubboTp: # dubbo 线程池配置 - - threadPoolName: dubboTp#20880 # 名称规则:dubboTp + "#" + 协议端口 - threadPoolAliasName: 测试线程池 - corePoolSize: 100 - maximumPoolSize: 200 - keepAliveTime: 60 - notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警) - - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 - enabled: true - threshold: 80 # 报警阈值 - platforms: [ ding,wechat ] # 可选配置,不配置默认拿上层platforms配置的所以平台 - interval: 120 # 报警间隔(单位:s) +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + dubboTp: # dubbo 线程池配置 + - threadPoolName: dubboTp#20880 # 名称规则:dubboTp + "#" + 协议端口 + threadPoolAliasName: 测试线程池 + corePoolSize: 100 + maximumPoolSize: 200 + keepAliveTime: 60 + notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警) + - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 + enabled: true + threshold: 80 # 报警阈值 + platforms: [ ding,wechat ] # 可选配置,不配置默认拿上层platforms配置的所以平台 + interval: 120 # 报警间隔(单位:s) dubbo: application: diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.9/pom.xml b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.9/pom.xml index 0fa9cd5b8340fddc705e374e8d7f617612b845ed..5394b2ae6eae98cdebe324a7dc6b87dd7356687c 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.9/pom.xml +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.9/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-example-adapter-apache-dubbo - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter-apache-dubbo-2.7.9 diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.9/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.9/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java index 8d45d56c5c372e619ed703f184f63273197e0d7d..c1f71f36f32c34e03fcc2388882c491a40d468f8 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.9/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.9/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java @@ -17,16 +17,16 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author fabian4 */ -@EnableDubbo @EnableDynamicTp +@EnableDubbo @SpringBootApplication public class DubboExampleApplication { public static void main(String[] args) { diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.9/src/main/resources/application.yml b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.9/src/main/resources/application.yml index 7cb1f62e8d2042ec64c7c1bbdcaf67364a5f778e..ad48d6b2f98738cff87f5c6c802b2f0caf52f10e 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.9/src/main/resources/application.yml +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-2.7.9/src/main/resources/application.yml @@ -7,35 +7,34 @@ spring: profiles: active: dev - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - dubboTp: # dubbo 线程池配置 - - threadPoolName: dubboTp#20880 # 名称规则:dubboTp + "#" + 协议端口 - threadPoolAliasName: 测试线程池 - corePoolSize: 100 - maximumPoolSize: 200 - keepAliveTime: 60 - notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警) - - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 - enabled: true - threshold: 80 # 报警阈值 - platforms: [ ding,wechat ] # 可选配置,不配置默认拿上层platforms配置的所以平台 - interval: 120 # 报警间隔(单位:s) +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + dubboTp: # dubbo 线程池配置 + - threadPoolName: dubboTp#20880 # 名称规则:dubboTp + "#" + 协议端口 + threadPoolAliasName: 测试线程池 + corePoolSize: 100 + maximumPoolSize: 200 + keepAliveTime: 60 + notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警) + - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 + enabled: true + threshold: 80 # 报警阈值 + platforms: [ ding,wechat ] # 可选配置,不配置默认拿上层platforms配置的所以平台 + interval: 120 # 报警间隔(单位:s) dubbo: application: diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.0.7/pom.xml b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.0.7/pom.xml index d722acda1110eb09e3297c8cbef4ec6ba55791e4..1c37e100765eb9dda7aa77fe861de4b152e2264c 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.0.7/pom.xml +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.0.7/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-example-adapter-apache-dubbo - ${revision} + 1.2.1 ../pom.xml diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.0.7/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.0.7/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java index 8d45d56c5c372e619ed703f184f63273197e0d7d..c1f71f36f32c34e03fcc2388882c491a40d468f8 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.0.7/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.0.7/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java @@ -17,16 +17,16 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author fabian4 */ -@EnableDubbo @EnableDynamicTp +@EnableDubbo @SpringBootApplication public class DubboExampleApplication { public static void main(String[] args) { diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.0.7/src/main/resources/application.yml b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.0.7/src/main/resources/application.yml index 7cb1f62e8d2042ec64c7c1bbdcaf67364a5f778e..ad48d6b2f98738cff87f5c6c802b2f0caf52f10e 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.0.7/src/main/resources/application.yml +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.0.7/src/main/resources/application.yml @@ -7,35 +7,34 @@ spring: profiles: active: dev - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - dubboTp: # dubbo 线程池配置 - - threadPoolName: dubboTp#20880 # 名称规则:dubboTp + "#" + 协议端口 - threadPoolAliasName: 测试线程池 - corePoolSize: 100 - maximumPoolSize: 200 - keepAliveTime: 60 - notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警) - - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 - enabled: true - threshold: 80 # 报警阈值 - platforms: [ ding,wechat ] # 可选配置,不配置默认拿上层platforms配置的所以平台 - interval: 120 # 报警间隔(单位:s) +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + dubboTp: # dubbo 线程池配置 + - threadPoolName: dubboTp#20880 # 名称规则:dubboTp + "#" + 协议端口 + threadPoolAliasName: 测试线程池 + corePoolSize: 100 + maximumPoolSize: 200 + keepAliveTime: 60 + notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警) + - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 + enabled: true + threshold: 80 # 报警阈值 + platforms: [ ding,wechat ] # 可选配置,不配置默认拿上层platforms配置的所以平台 + interval: 120 # 报警间隔(单位:s) dubbo: application: diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.2.10/pom.xml b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.2.10/pom.xml index b637abe2f880e2d7461b78b00c2f22212d8c6067..11a68ae9e346d153a7ae999577a53c9f237eb025 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.2.10/pom.xml +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.2.10/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-example-adapter-apache-dubbo - ${revision} + 1.2.1 ../pom.xml diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.2.10/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.2.10/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java index 8d45d56c5c372e619ed703f184f63273197e0d7d..c1f71f36f32c34e03fcc2388882c491a40d468f8 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.2.10/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.2.10/src/main/java/org/dromara/dynamictp/example/DubboExampleApplication.java @@ -17,16 +17,16 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author fabian4 */ -@EnableDubbo @EnableDynamicTp +@EnableDubbo @SpringBootApplication public class DubboExampleApplication { public static void main(String[] args) { diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.2.10/src/main/resources/application.yml b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.2.10/src/main/resources/application.yml index 7d1cfecb3a74da7cafe09a85407f49f1b7f7602e..32fb8348005e67bf06db60b4cad2ba987a802a6d 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.2.10/src/main/resources/application.yml +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/example-adapter-apache-dubbo-3.2.10/src/main/resources/application.yml @@ -5,32 +5,31 @@ spring: application: name: dynamic-tp-adapter-dubbo-demo - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 - platforms: # 通知报警平台配置 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - dubboTp: # dubbo 线程池配置 - - threadPoolName: dubboTp#20880 # 名称规则:dubboTp + "#" + 协议端口 - threadPoolAliasName: 测试线程池 - corePoolSize: 100 - maximumPoolSize: 200 - keepAliveTime: 60 - notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警) - - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 - enabled: true - threshold: 80 # 报警阈值 - platforms: [ ding ] # 可选配置,不配置默认拿上层platforms配置的所以平台 - interval: 120 # 报警间隔(单位:s) +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + platforms: # 通知报警平台配置 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + dubboTp: # dubbo 线程池配置 + - threadPoolName: dubboTp#20880 # 名称规则:dubboTp + "#" + 协议端口 + threadPoolAliasName: 测试线程池 + corePoolSize: 100 + maximumPoolSize: 200 + keepAliveTime: 60 + notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警) + - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 + enabled: true + threshold: 80 # 报警阈值 + platforms: [ ding ] # 可选配置,不配置默认拿上层platforms配置的所以平台 + interval: 120 # 报警间隔(单位:s) dubbo: application: diff --git a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/pom.xml b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/pom.xml index 04260106d17d325491f9c71956328ccf449bbdea..1136b0212828aa08bc80958a6a1b06af7a687e85 100644 --- a/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/pom.xml +++ b/example/example-adapter/example-adapter-dubbo/example-adapter-apache-dubbo/pom.xml @@ -6,7 +6,7 @@ dynamic-tp-example-adapter-dubbo org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter-apache-dubbo diff --git a/example/example-adapter/example-adapter-dubbo/pom.xml b/example/example-adapter/example-adapter-dubbo/pom.xml index 6b03cab76481ae3320395001e49547277bcb95d4..939599b0a7913e190d553802d0823c1a42594aec 100644 --- a/example/example-adapter/example-adapter-dubbo/pom.xml +++ b/example/example-adapter/example-adapter-dubbo/pom.xml @@ -5,7 +5,7 @@ dynamic-tp-example-adapter org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter-dubbo @@ -34,7 +34,7 @@ org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-dubbo - ${revision} + 1.2.1 diff --git a/example/example-adapter/example-adapter-grpc/pom.xml b/example/example-adapter/example-adapter-grpc/pom.xml index f89c97335cc96ff5fce988fba17907be1eb6ea72..43bbb4cf31c77d85847c4384bca212f802110bd0 100644 --- a/example/example-adapter/example-adapter-grpc/pom.xml +++ b/example/example-adapter/example-adapter-grpc/pom.xml @@ -5,7 +5,7 @@ dynamic-tp-example-adapter org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter-grpc @@ -40,13 +40,12 @@ org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-grpc - ${revision} + 1.2.1 net.devh grpc-spring-boot-starter - 2.13.1.RELEASE @@ -57,6 +56,12 @@ com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery + + + com.google.protobuf + protobuf-java + + @@ -70,18 +75,18 @@ kr.motd.maven os-maven-plugin - 1.4.1.Final + 1.7.1 org.xolstice.maven.plugins protobuf-maven-plugin - 0.5.0 + 0.6.1 - com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier} + com.google.protobuf:protoc:3.18.2:exe:${os.detected.classifier} grpc-java - io.grpc:protoc-gen-grpc-java:1.0.0:exe:${os.detected.classifier} + io.grpc:protoc-gen-grpc-java:1.69.1:exe:${os.detected.classifier} diff --git a/example/example-adapter/example-adapter-grpc/src/main/java/org/dromara/dynamictp/example/GrpcExampleApplication.java b/example/example-adapter/example-adapter-grpc/src/main/java/org/dromara/dynamictp/example/GrpcExampleApplication.java index 89266c6249f02c4e5a8d135eb697dcc55a9e72de..cb0121d67116474661cf3b418f86b60cfdbfe4da 100644 --- a/example/example-adapter/example-adapter-grpc/src/main/java/org/dromara/dynamictp/example/GrpcExampleApplication.java +++ b/example/example-adapter/example-adapter-grpc/src/main/java/org/dromara/dynamictp/example/GrpcExampleApplication.java @@ -17,15 +17,16 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; /** * @author fabian4 */ @EnableDynamicTp -@SpringBootApplication +@SpringBootApplication(exclude = RedisAutoConfiguration.class) public class GrpcExampleApplication { public static void main(String[] args) { SpringApplication.run(GrpcExampleApplication.class, args); diff --git a/example/example-adapter/example-adapter-grpc/src/main/resources/application.yml b/example/example-adapter/example-adapter-grpc/src/main/resources/application.yml index d458aef507917c36278681f1f800003ea2021eab..1092167338b3e1ea58ed476a7996411aba2cc1ec 100644 --- a/example/example-adapter/example-adapter-grpc/src/main/resources/application.yml +++ b/example/example-adapter/example-adapter-grpc/src/main/resources/application.yml @@ -19,28 +19,27 @@ spring: refresh: true # 必须配置,负责自动刷新不生效 refresh-enabled: true - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - grpcTp: # grpc 线程池配置 - - threadPoolName: grpcTp#9999 - corePoolSize: 100 - maximumPoolSize: 200 - keepAliveTime: 60 +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + grpcTp: # grpc 线程池配置 + - threadPoolName: grpcTp#9999 + corePoolSize: 100 + maximumPoolSize: 200 + keepAliveTime: 60 grpc: server: diff --git a/example/example-adapter/example-adapter-hystrix/pom.xml b/example/example-adapter/example-adapter-hystrix/pom.xml index 0609677199d1eda244dc89b2932150fdb492230c..eede4a971a603acbaf38a307d393ead04f423d0e 100644 --- a/example/example-adapter/example-adapter-hystrix/pom.xml +++ b/example/example-adapter/example-adapter-hystrix/pom.xml @@ -5,7 +5,7 @@ dynamic-tp-example-adapter org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter-hystrix @@ -28,7 +28,7 @@ org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-hystrix - ${revision} + 1.2.1 diff --git a/example/example-adapter/example-adapter-hystrix/src/main/java/org/dromara/dynamictp/example/HystrixExampleApplication.java b/example/example-adapter/example-adapter-hystrix/src/main/java/org/dromara/dynamictp/example/HystrixExampleApplication.java index b36dc3151d5848e5b0aaa52b7157a62027dcd5f3..b0df0248bb8034288a1ae9447c1343be2e5ebe1e 100644 --- a/example/example-adapter/example-adapter-hystrix/src/main/java/org/dromara/dynamictp/example/HystrixExampleApplication.java +++ b/example/example-adapter/example-adapter-hystrix/src/main/java/org/dromara/dynamictp/example/HystrixExampleApplication.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.hystrix.EnableHystrix; @@ -25,8 +25,8 @@ import org.springframework.cloud.netflix.hystrix.EnableHystrix; /** * @author fabian4 */ -@EnableHystrix @EnableDynamicTp +@EnableHystrix @SpringBootApplication public class HystrixExampleApplication { diff --git a/example/example-adapter/example-adapter-hystrix/src/main/resources/application.yml b/example/example-adapter/example-adapter-hystrix/src/main/resources/application.yml index e314fb2dbb3b60325ac7ad4618f54f389963175f..91937e3b36901a8f545fa201168c93f5d97bc869 100644 --- a/example/example-adapter/example-adapter-hystrix/src/main/resources/application.yml +++ b/example/example-adapter/example-adapter-hystrix/src/main/resources/application.yml @@ -7,28 +7,27 @@ spring: profiles: active: dev - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - hystrixTp: # hystrix 线程池配置 - - threadPoolName: testThreadPoolKey - corePoolSize: 100 - maximumPoolSize: 200 - keepAliveTime: 60 +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + hystrixTp: # hystrix 线程池配置 + - threadPoolName: testThreadPoolKey + corePoolSize: 100 + maximumPoolSize: 200 + keepAliveTime: 60 # 开启 SpringBoot Actuator Endpoint 暴露出DynamicTp指标接口 # 开启 prometheus 指标采集端点 diff --git a/example/example-adapter/example-adapter-liteflow/pom.xml b/example/example-adapter/example-adapter-liteflow/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..c399968c1ae06c67fb11e1f8b67aae9fd8dfd5b3 --- /dev/null +++ b/example/example-adapter/example-adapter-liteflow/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + dynamic-tp-example-adapter + org.dromara.dynamictp + 1.2.1 + ../pom.xml + + dynamic-tp-example-adapter-liteflow + + + true + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-logging + + + + com.yomahub + liteflow-spring-boot-starter + 2.12.3 + + + + org.dromara.dynamictp + dynamic-tp-spring-boot-starter-adapter-liteflow + + + + org.springframework + spring-context + + + + diff --git a/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/LiteflowExampleApplication.java b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/LiteflowExampleApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..c6445d5ecc9957b80cdef085bf692d256852d596 --- /dev/null +++ b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/LiteflowExampleApplication.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.example; + +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * LiteflowExampleApplication related + * + * @author yanhom + * @since 1.1.9 + */ +@EnableDynamicTp +@SpringBootApplication +public class LiteflowExampleApplication { + + public static void main(String[] args) { + SpringApplication.run(LiteflowExampleApplication.class, args); + } +} diff --git a/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/cmp/ACmp.java b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/cmp/ACmp.java new file mode 100644 index 0000000000000000000000000000000000000000..f465b4dac50fdfcae594e4dd56f94d2f44f98305 --- /dev/null +++ b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/cmp/ACmp.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.example.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.example.ctx.CusCtx; +import org.springframework.stereotype.Component; + +/** + * ACmp related + * + * @author yanhom + * @since 1.1.9 + */ +@Slf4j +@Component("a") +public class ACmp extends NodeComponent { + + @Override + public void process() { + CusCtx ctx = this.getFirstContextBean(); + log.info("a, ctx:{}", ctx); + } +} + diff --git a/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/cmp/BCmp.java b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/cmp/BCmp.java new file mode 100644 index 0000000000000000000000000000000000000000..bf4568c65eda9036f1b820cf20926b68978e6f29 --- /dev/null +++ b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/cmp/BCmp.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.example.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.example.ctx.CusCtx; +import org.springframework.stereotype.Component; + +/** + * BCmp related + * + * @author yanhom + * @since 1.1.9 + */ +@Slf4j +@Component("b") +public class BCmp extends NodeComponent { + + @Override + public void process() { + CusCtx ctx = this.getFirstContextBean(); + log.info("b, ctx:{}", ctx); + } +} + diff --git a/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/cmp/CCmp.java b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/cmp/CCmp.java new file mode 100644 index 0000000000000000000000000000000000000000..b2bf80b257e3c8cf1f0bf5631781fe746d095ee6 --- /dev/null +++ b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/cmp/CCmp.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.example.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.example.ctx.CusCtx; +import org.springframework.stereotype.Component; + +/** + * CCmp related + * + * @author yanhom + * @since 1.1.9 + */ +@Slf4j +@Component("c") +public class CCmp extends NodeComponent { + + @Override + public void process() { + CusCtx ctx = this.getFirstContextBean(); + log.info("c, ctx:{}", ctx); + } +} + diff --git a/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/controller/TestController.java b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/controller/TestController.java new file mode 100644 index 0000000000000000000000000000000000000000..5bbc2233bec58bd478f523efa2e055085994160c --- /dev/null +++ b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/controller/TestController.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.example.controller; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.example.service.BizService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * TestController related + * + * @author yanhom + * @since 1.1.9 + */ +@Slf4j +@RestController +@SuppressWarnings("all") +public class TestController { + + @Resource + private BizService bizService; + + @GetMapping("/dtp-example-adapter/testLiteflow") + public String testLiteflow() throws InterruptedException { + bizService.testConfig(); + return "success"; + } +} diff --git a/core/src/main/java/org/dromara/dynamictp/core/spring/SpringExecutor.java b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/ctx/CusCtx.java similarity index 78% rename from core/src/main/java/org/dromara/dynamictp/core/spring/SpringExecutor.java rename to example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/ctx/CusCtx.java index d747628286bf50af30aaa2635d496ff588a71e0e..69be64db6ce35d4e049c39bd4b32523c95422a67 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/spring/SpringExecutor.java +++ b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/ctx/CusCtx.java @@ -15,16 +15,22 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.spring; +package org.dromara.dynamictp.example.ctx; -import org.springframework.core.task.AsyncTaskExecutor; +import lombok.AllArgsConstructor; +import lombok.Data; /** - * SpringExecutor related + * CusCtx related * * @author yanhom * @since 1.1.0 - **/ -public interface SpringExecutor extends AsyncTaskExecutor { + */ +@AllArgsConstructor(staticName = "of") +@Data +public class CusCtx { + + private Long id; + private String name; } diff --git a/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/service/BizService.java b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/service/BizService.java new file mode 100644 index 0000000000000000000000000000000000000000..0f7927072f3adcc80e9ba1c610f28dff3158b3e7 --- /dev/null +++ b/example/example-adapter/example-adapter-liteflow/src/main/java/org/dromara/dynamictp/example/service/BizService.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.example.service; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.example.ctx.CusCtx; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * BizService related + * + * @author yanhom + * @since 1.1.9 + */ +@Slf4j +@Service +public class BizService { + + @Resource + private FlowExecutor flowExecutor; + + public void testConfig() { + CusCtx ctx = CusCtx.of(1L, "test"); + LiteflowResponse response = flowExecutor.execute2Resp("chain1", null, ctx); + log.info("response:{}", response); + } +} diff --git a/example/example-adapter/example-adapter-liteflow/src/main/resources/application.yml b/example/example-adapter/example-adapter-liteflow/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..a20b74c4837b21c6d5d098c945c8b8b4675db27d --- /dev/null +++ b/example/example-adapter/example-adapter-liteflow/src/main/resources/application.yml @@ -0,0 +1,34 @@ +server: + port: 9119 + +liteflow: + rule-source: config/flow.el.xml + +spring: + application: + name: dynamic-tp-adapter-liteflow-demo + profiles: + active: dev + +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + liteflowTp: + - threadPoolName: liteflowTp#LiteFlowDefaultWhenExecutorBuilder + corePoolSize: 10 + maximumPoolSize: 20 + keepAliveTime: 60 + +# 开启 SpringBoot Actuator Endpoint 暴露出DynamicTp指标接口 +# 开启 prometheus 指标采集端点 +management: + metrics: + export: + prometheus: + enabled: true + endpoints: + web: + exposure: + include: '*' # 测试使用,线上不要用*,按需开启 \ No newline at end of file diff --git a/example/example-adapter/example-adapter-liteflow/src/main/resources/config/flow.el.xml b/example/example-adapter/example-adapter-liteflow/src/main/resources/config/flow.el.xml new file mode 100644 index 0000000000000000000000000000000000000000..161f6279a71baa23e76c64ecd710f38215864cc8 --- /dev/null +++ b/example/example-adapter/example-adapter-liteflow/src/main/resources/config/flow.el.xml @@ -0,0 +1,6 @@ + + + + WHEN(a, b, c); + + diff --git a/example/example-adapter/example-adapter-motan/pom.xml b/example/example-adapter/example-adapter-motan/pom.xml index b0b00395f516f8288ecaf8a74558783643fe4083..d2a029a730c84254017c3983298bcaea4aa20eb7 100644 --- a/example/example-adapter/example-adapter-motan/pom.xml +++ b/example/example-adapter/example-adapter-motan/pom.xml @@ -5,7 +5,7 @@ dynamic-tp-example-adapter org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter-motan @@ -28,7 +28,7 @@ org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-motan - ${revision} + 1.2.1 diff --git a/example/example-adapter/example-adapter-motan/src/main/java/org/dromara/dynamictp/example/MotanExampleApplication.java b/example/example-adapter/example-adapter-motan/src/main/java/org/dromara/dynamictp/example/MotanExampleApplication.java index 168f4f660ffe70e901b31b60b0ae648acadfb5fc..9a3cdfce05a737b31491fe43c300ff0e91ed616c 100644 --- a/example/example-adapter/example-adapter-motan/src/main/java/org/dromara/dynamictp/example/MotanExampleApplication.java +++ b/example/example-adapter/example-adapter-motan/src/main/java/org/dromara/dynamictp/example/MotanExampleApplication.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; diff --git a/example/example-adapter/example-adapter-motan/src/main/resources/application.yml b/example/example-adapter/example-adapter-motan/src/main/resources/application.yml index daed76a014ea901b2bdd0fd72f84fbfd0878ebd5..c19c4f548321b89b316ce110e5e61e1673bc5ab9 100644 --- a/example/example-adapter/example-adapter-motan/src/main/resources/application.yml +++ b/example/example-adapter/example-adapter-motan/src/main/resources/application.yml @@ -7,28 +7,27 @@ spring: profiles: active: dev - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - motanTp: # motan server 线程池配置 - - threadPoolName: motanTp#8002 - corePoolSize: 100 - maximumPoolSize: 200 - keepAliveTime: 60 +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + motanTp: # motan server 线程池配置 + - threadPoolName: motanTp#8002 + corePoolSize: 100 + maximumPoolSize: 200 + keepAliveTime: 60 # 开启 SpringBoot Actuator Endpoint 暴露出DynamicTp指标接口 # 开启 prometheus 指标采集端点 diff --git a/example/example-adapter/example-adapter-okhttp3/pom.xml b/example/example-adapter/example-adapter-okhttp3/pom.xml index 21f4fa0b42b6f6b54dd51530a5e403d20666cb90..a1a2159832f6f814c8d6faf24c71461e705e5e7f 100644 --- a/example/example-adapter/example-adapter-okhttp3/pom.xml +++ b/example/example-adapter/example-adapter-okhttp3/pom.xml @@ -5,14 +5,14 @@ dynamic-tp-example-adapter org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter-okhttp3 true - 3.14.9 + 4.12.0 diff --git a/example/example-adapter/example-adapter-okhttp3/src/main/java/org/dromara/dynamictp/example/Okhttp3ExampleApplication.java b/example/example-adapter/example-adapter-okhttp3/src/main/java/org/dromara/dynamictp/example/Okhttp3ExampleApplication.java index 0dd788e5c2a46963844e0794a394d55d279ca988..af86f8577004792f19e2a2c9e746bc95c1fb532d 100644 --- a/example/example-adapter/example-adapter-okhttp3/src/main/java/org/dromara/dynamictp/example/Okhttp3ExampleApplication.java +++ b/example/example-adapter/example-adapter-okhttp3/src/main/java/org/dromara/dynamictp/example/Okhttp3ExampleApplication.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/example/example-adapter/example-adapter-okhttp3/src/main/resources/application.yml b/example/example-adapter/example-adapter-okhttp3/src/main/resources/application.yml index 6c7bfdd8fc2377961dbd7af01a0aae4fc8e6b959..0c0cc60f0b0b5226df55a44e13dc91c970d962c1 100644 --- a/example/example-adapter/example-adapter-okhttp3/src/main/resources/application.yml +++ b/example/example-adapter/example-adapter-okhttp3/src/main/resources/application.yml @@ -7,36 +7,35 @@ spring: profiles: active: dev - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 32d7bf40-1353 # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - okhttp3Tp: # okhttp3 线程池配置 - - threadPoolName: okHttpClientTp - corePoolSize: 1 - maximumPoolSize: 1 - keepAliveTime: 60 - runTimeout: 20 - queueTimeout: 10 - tomcatTp: # tomcat webserver 线程池配置 - corePoolSize: 1 - maximumPoolSize: 1 - keepAliveTime: 60 - runTimeout: 20 - queueTimeout: 10 +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 32d7bf40-1353 # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + okhttp3Tp: # okhttp3 线程池配置 + - threadPoolName: okHttpClientTp + corePoolSize: 1 + maximumPoolSize: 1 + keepAliveTime: 60 + runTimeout: 20 + queueTimeout: 10 + tomcatTp: # tomcat webserver 线程池配置 + corePoolSize: 1 + maximumPoolSize: 1 + keepAliveTime: 60 + runTimeout: 20 + queueTimeout: 10 # 开启 SpringBoot Actuator Endpoint 暴露出DynamicTp指标接口 # 开启 prometheus 指标采集端点 diff --git a/example/example-adapter/example-adapter-rabbitmq/pom.xml b/example/example-adapter/example-adapter-rabbitmq/pom.xml index a60b62b43d88e9572230031dfb4233461e16f895..f70046b9550c2773bc3159759a5b95df5c2ddebf 100644 --- a/example/example-adapter/example-adapter-rabbitmq/pom.xml +++ b/example/example-adapter/example-adapter-rabbitmq/pom.xml @@ -5,7 +5,7 @@ dynamic-tp-example-adapter org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter-rabbitmq @@ -23,7 +23,7 @@ org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-rabbitmq - ${revision} + 1.2.1 org.springframework.amqp diff --git a/example/example-adapter/example-adapter-rabbitmq/src/main/java/org/dromara/dynamictp/example/RabbitMqExampleApplication.java b/example/example-adapter/example-adapter-rabbitmq/src/main/java/org/dromara/dynamictp/example/RabbitMqExampleApplication.java index 256f90e394bae86a398bc7ee95874ea6f9254828..74afa2997b9edf0a2496a7f95f6fcac851796089 100644 --- a/example/example-adapter/example-adapter-rabbitmq/src/main/java/org/dromara/dynamictp/example/RabbitMqExampleApplication.java +++ b/example/example-adapter/example-adapter-rabbitmq/src/main/java/org/dromara/dynamictp/example/RabbitMqExampleApplication.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/example/example-adapter/example-adapter-rabbitmq/src/main/resources/application.yml b/example/example-adapter/example-adapter-rabbitmq/src/main/resources/application.yml index 97df5f97e92026d149c53b5a25e096262697ece1..a48b8276cdaf7504ad40b77c4d9655a975072614 100644 --- a/example/example-adapter/example-adapter-rabbitmq/src/main/resources/application.yml +++ b/example/example-adapter/example-adapter-rabbitmq/src/main/resources/application.yml @@ -15,20 +15,19 @@ spring: #password: rabbit #addresses: 111111 - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: internal_logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 - rabbitmqTp: # rabbitmq 线程池配置 配置自行修改 - - threadPoolName: rabbitConnectionFactoryTp - threadPoolAliasName: rabbit线程池 - threadNamePrefix: rabbitExecutor - corePoolSize: 8 - maximumPoolSize: 16 - #单位秒 - keepAliveTime: 60 +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: internal_logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + rabbitmqTp: # rabbitmq 线程池配置 配置自行修改 + - threadPoolName: rabbitConnectionFactoryTp + threadPoolAliasName: rabbit线程池 + threadNamePrefix: rabbitExecutor + corePoolSize: 8 + maximumPoolSize: 16 + #单位秒 + keepAliveTime: 60 # 开启 SpringBoot Actuator Endpoint 暴露出DynamicTp指标接口 # 开启 prometheus 指标采集端点 diff --git a/example/example-adapter/example-adapter-rocketmq/pom.xml b/example/example-adapter/example-adapter-rocketmq/pom.xml index d3d3c8e0cc24fe56570c3f1e7d215e541feab89c..1e763c7cf5963198bc44ecf12b5149c98851f652 100644 --- a/example/example-adapter/example-adapter-rocketmq/pom.xml +++ b/example/example-adapter/example-adapter-rocketmq/pom.xml @@ -5,7 +5,7 @@ dynamic-tp-example-adapter org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter-rocketmq diff --git a/example/example-adapter/example-adapter-rocketmq/src/main/java/org/dromara/dynamictp/example/RocketMqExampleApplication.java b/example/example-adapter/example-adapter-rocketmq/src/main/java/org/dromara/dynamictp/example/RocketMqExampleApplication.java index 84594d50ba6ebd5bfcdc1b064b0ba922b94c14ce..7bf6368ef634bbf6e85f5ac374279eae5aee8ead 100644 --- a/example/example-adapter/example-adapter-rocketmq/src/main/java/org/dromara/dynamictp/example/RocketMqExampleApplication.java +++ b/example/example-adapter/example-adapter-rocketmq/src/main/java/org/dromara/dynamictp/example/RocketMqExampleApplication.java @@ -17,15 +17,15 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author fabian4 */ -@EnableDynamicTp @SpringBootApplication +@EnableDynamicTp public class RocketMqExampleApplication { public static void main(String[] args) { diff --git a/example/example-adapter/example-adapter-rocketmq/src/main/resources/application.yml b/example/example-adapter/example-adapter-rocketmq/src/main/resources/application.yml index 8c37229c8aab6753bd2c985534908f9c24237693..f951349b9adb8a1217de7fc138cf9f30b0d92aea 100644 --- a/example/example-adapter/example-adapter-rocketmq/src/main/resources/application.yml +++ b/example/example-adapter/example-adapter-rocketmq/src/main/resources/application.yml @@ -7,30 +7,29 @@ spring: profiles: active: dev - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - - platform: email - receivers: 123456@qq.com,789789@qq.com # 收件人 - rocketMqTp: # rocketmq 线程池配置 - - threadPoolName: group#topic # 名称规则:group + "#" + topic - corePoolSize: 200 - maximumPoolSize: 200 - keepAliveTime: 60 +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + - platform: email + receivers: 123456@qq.com,789789@qq.com # 收件人 + rocketMqTp: # rocketmq 线程池配置 + - threadPoolName: group#topic # 名称规则:group + "#" + topic + corePoolSize: 200 + maximumPoolSize: 200 + keepAliveTime: 60 rocketmq: name-server: 127.0.0.1:9876 diff --git a/example/example-adapter/example-adapter-thrift/pom.xml b/example/example-adapter/example-adapter-thrift/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..c84039fab66a46439e5fe32755581100c150aff9 --- /dev/null +++ b/example/example-adapter/example-adapter-thrift/pom.xml @@ -0,0 +1,130 @@ + + + 4.0.0 + + dynamic-tp-example-adapter + org.dromara.dynamictp + 1.2.1 + ../pom.xml + + dynamic-tp-example-adapter-thrift + + + true + + + + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + 2021.1 + pom + import + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-logging + + + + org.dromara.dynamictp + dynamic-tp-spring-boot-starter-adapter-thrift + 1.2.1 + + + + org.apache.thrift + libthrift + 0.21.0 + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + + + kr.motd.maven + os-maven-plugin + 1.7.1 + + + + + + + skip-thrift + + + skipThrift + true + + + + + + + + + + + + + + + + with-thrift + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/ThriftExampleApplication.java b/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/ThriftExampleApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..2fe9b5ac2d9343c4bf09dc5170bbc391f014e6ea --- /dev/null +++ b/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/ThriftExampleApplication.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.example; + +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; + +/** + * @author devin + * @since 1.2.2 + */ +@EnableDynamicTp +@SpringBootApplication(exclude = RedisAutoConfiguration.class) +public class ThriftExampleApplication { + public static void main(String[] args) { + SpringApplication.run(ThriftExampleApplication.class, args); + } +} diff --git a/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/controller/TestController.java b/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/controller/TestController.java new file mode 100644 index 0000000000000000000000000000000000000000..171a1c6682870f3f5d214d57f76373d639b5f803 --- /dev/null +++ b/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/controller/TestController.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.example.controller; + +import org.dromara.dynamictp.example.thrift.ThriftClientService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * @author devin + * @since 1.2.2 + */ +@Slf4j +@RestController +@SuppressWarnings("all") +public class TestController { + + @Resource + private ThriftClientService thriftClientService; + + @GetMapping("/dtp-example-adapter/testThrift") + public String testThrift() { + return thriftClientService.sendMessage("test dynamic tp"); + } +} diff --git a/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/thrift/ThriftClientService.java b/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/thrift/ThriftClientService.java new file mode 100644 index 0000000000000000000000000000000000000000..180c45c4907c5105d316355e85a340f96b90e9a2 --- /dev/null +++ b/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/thrift/ThriftClientService.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.example.thrift; + +import lombok.extern.slf4j.Slf4j; +import org.apache.thrift.TException; +import org.apache.thrift.protocol.TBinaryProtocol; +import org.apache.thrift.protocol.TProtocol; +import org.apache.thrift.transport.TSocket; +import org.apache.thrift.transport.TTransport; +import org.dromara.dynamictp.example.thrift.service.SimpleService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +/** + * ThriftClientService related + * + * @author devin + * @since 1.2.2 + */ +@Service +@Slf4j +public class ThriftClientService { + + @Value("${thrift.server.port:9998}") + private int serverPort; + + @Value("${thrift.server.host:localhost}") + private String serverHost; + + public String sendMessage(final String name) { + try (TTransport transport = new TSocket(serverHost, serverPort)) { + transport.open(); + TProtocol protocol = new TBinaryProtocol(transport); + SimpleService.Client client = new SimpleService.Client(protocol); + return client.sayHello(name); + } catch (TException e) { + log.error("Request failed", e); + return "FAILED with " + e.getMessage(); + } + } +} diff --git a/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/thrift/ThriftServerService.java b/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/thrift/ThriftServerService.java new file mode 100644 index 0000000000000000000000000000000000000000..47434d98f109cd7767f0921dd5f115cc8e573a5c --- /dev/null +++ b/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/thrift/ThriftServerService.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.example.thrift; + +import lombok.extern.slf4j.Slf4j; +import org.apache.thrift.TProcessor; +import org.apache.thrift.protocol.TBinaryProtocol; +import org.apache.thrift.server.TThreadPoolServer; +import org.apache.thrift.transport.TServerSocket; +import org.apache.thrift.transport.TTransportException; +import org.dromara.dynamictp.example.thrift.service.SimpleService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * ThriftServerService related + * + * @author devin + * @since 1.2.2 + */ +@Service +@Slf4j +public class ThriftServerService implements SimpleService.Iface { + + @Value("${thrift.server.port:9998}") + private int serverPort; + + private TThreadPoolServer server; + private ExecutorService executorService; + + @PostConstruct + public void start() { + executorService = Executors.newSingleThreadExecutor(); + executorService.submit(() -> { + try { + TServerSocket serverTransport = new TServerSocket(serverPort); + TProcessor processor = new SimpleService.Processor<>(this); + TThreadPoolServer.Args args = new TThreadPoolServer.Args(serverTransport) + .processor(processor) + .protocolFactory(new TBinaryProtocol.Factory()); + server = new TThreadPoolServer(args); + log.info("Starting Thrift server on port {}", serverPort); + server.serve(); + } catch (TTransportException e) { + e.printStackTrace(); + } + }); + } + + @PreDestroy + public void stop() { + if (server != null) { + server.stop(); + } + if (executorService != null) { + executorService.shutdown(); + } + } + + @Override + public String sayHello(String name) { + return "Hello ==> " + name; + } +} diff --git a/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/thrift/service/SimpleService.java b/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/thrift/service/SimpleService.java new file mode 100644 index 0000000000000000000000000000000000000000..2236ad2e66546358d3bd3677a8393db5370ca7f6 --- /dev/null +++ b/example/example-adapter/example-adapter-thrift/src/main/java/org/dromara/dynamictp/example/thrift/service/SimpleService.java @@ -0,0 +1,1023 @@ +/** + * Autogenerated by Thrift Compiler (0.21.0) + * + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * @generated + */ +package org.dromara.dynamictp.example.thrift.service; + +@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.21.0)", date = "2025-05-25") +@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) +public class SimpleService { + + public interface Iface { + + public java.lang.String sayHello(java.lang.String name) throws org.apache.thrift.TException; + + } + + public interface AsyncIface { + + public void sayHello(java.lang.String name, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException; + + } + + public static class Client extends org.apache.thrift.TServiceClient implements Iface { + public static class Factory implements org.apache.thrift.TServiceClientFactory { + public Factory() {} + @Override + public Client getClient(org.apache.thrift.protocol.TProtocol prot) { + return new Client(prot); + } + @Override + public Client getClient(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) { + return new Client(iprot, oprot); + } + } + + public Client(org.apache.thrift.protocol.TProtocol prot) + { + super(prot, prot); + } + + public Client(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) { + super(iprot, oprot); + } + + @Override + public java.lang.String sayHello(java.lang.String name) throws org.apache.thrift.TException + { + send_sayHello(name); + return recv_sayHello(); + } + + public void send_sayHello(java.lang.String name) throws org.apache.thrift.TException + { + sayHello_args args = new sayHello_args(); + args.setName(name); + sendBase("sayHello", args); + } + + public java.lang.String recv_sayHello() throws org.apache.thrift.TException + { + sayHello_result result = new sayHello_result(); + receiveBase(result, "sayHello"); + if (result.isSetSuccess()) { + return result.success; + } + throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "sayHello failed: unknown result"); + } + + } + public static class AsyncClient extends org.apache.thrift.async.TAsyncClient implements AsyncIface { + public static class Factory implements org.apache.thrift.async.TAsyncClientFactory { + private org.apache.thrift.async.TAsyncClientManager clientManager; + private org.apache.thrift.protocol.TProtocolFactory protocolFactory; + public Factory(org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.protocol.TProtocolFactory protocolFactory) { + this.clientManager = clientManager; + this.protocolFactory = protocolFactory; + } + @Override + public AsyncClient getAsyncClient(org.apache.thrift.transport.TNonblockingTransport transport) { + return new AsyncClient(protocolFactory, clientManager, transport); + } + } + + public AsyncClient(org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.transport.TNonblockingTransport transport) { + super(protocolFactory, clientManager, transport); + } + + @Override + public void sayHello(java.lang.String name, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException { + checkReady(); + sayHello_call method_call = new sayHello_call(name, resultHandler, this, ___protocolFactory, ___transport); + this.___currentMethod = method_call; + ___manager.call(method_call); + } + + public static class sayHello_call extends org.apache.thrift.async.TAsyncMethodCall { + private java.lang.String name; + public sayHello_call(java.lang.String name, org.apache.thrift.async.AsyncMethodCallback resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException { + super(client, protocolFactory, transport, resultHandler, false); + this.name = name; + } + + @Override + public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException { + prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("sayHello", org.apache.thrift.protocol.TMessageType.CALL, 0)); + sayHello_args args = new sayHello_args(); + args.setName(name); + args.write(prot); + prot.writeMessageEnd(); + } + + @Override + public java.lang.String getResult() throws org.apache.thrift.TException { + if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) { + throw new java.lang.IllegalStateException("Method call not finished!"); + } + org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array()); + org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport); + return (new Client(prot)).recv_sayHello(); + } + } + + } + + public static class Processor extends org.apache.thrift.TBaseProcessor implements org.apache.thrift.TProcessor { + private static final org.slf4j.Logger _LOGGER = org.slf4j.LoggerFactory.getLogger(Processor.class.getName()); + public Processor(I iface) { + super(iface, getProcessMap(new java.util.HashMap>())); + } + + protected Processor(I iface, java.util.Map> processMap) { + super(iface, getProcessMap(processMap)); + } + + private static java.util.Map> getProcessMap(java.util.Map> processMap) { + processMap.put("sayHello", new sayHello()); + return processMap; + } + + public static class sayHello extends org.apache.thrift.ProcessFunction { + public sayHello() { + super("sayHello"); + } + + @Override + public sayHello_args getEmptyArgsInstance() { + return new sayHello_args(); + } + + @Override + public boolean isOneway() { + return false; + } + + @Override + protected boolean rethrowUnhandledExceptions() { + return false; + } + + @Override + public sayHello_result getEmptyResultInstance() { + return new sayHello_result(); + } + + @Override + public sayHello_result getResult(I iface, sayHello_args args) throws org.apache.thrift.TException { + sayHello_result result = getEmptyResultInstance(); + result.success = iface.sayHello(args.name); + return result; + } + } + + } + + public static class AsyncProcessor extends org.apache.thrift.TBaseAsyncProcessor { + private static final org.slf4j.Logger _LOGGER = org.slf4j.LoggerFactory.getLogger(AsyncProcessor.class.getName()); + public AsyncProcessor(I iface) { + super(iface, getProcessMap(new java.util.HashMap>())); + } + + protected AsyncProcessor(I iface, java.util.Map> processMap) { + super(iface, getProcessMap(processMap)); + } + + private static java.util.Map> getProcessMap(java.util.Map> processMap) { + processMap.put("sayHello", new sayHello()); + return processMap; + } + + public static class sayHello extends org.apache.thrift.AsyncProcessFunction { + public sayHello() { + super("sayHello"); + } + + @Override + public sayHello_result getEmptyResultInstance() { + return new sayHello_result(); + } + + @Override + public sayHello_args getEmptyArgsInstance() { + return new sayHello_args(); + } + + @Override + public org.apache.thrift.async.AsyncMethodCallback getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) { + final org.apache.thrift.AsyncProcessFunction fcall = this; + return new org.apache.thrift.async.AsyncMethodCallback() { + @Override + public void onComplete(java.lang.String o) { + sayHello_result result = new sayHello_result(); + result.success = o; + try { + fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid); + } catch (org.apache.thrift.transport.TTransportException e) { + _LOGGER.error("TTransportException writing to internal frame buffer", e); + fb.close(); + } catch (java.lang.Exception e) { + _LOGGER.error("Exception writing to internal frame buffer", e); + onError(e); + } + } + @Override + public void onError(java.lang.Exception e) { + byte msgType = org.apache.thrift.protocol.TMessageType.REPLY; + org.apache.thrift.TSerializable msg; + sayHello_result result = new sayHello_result(); + if (e instanceof org.apache.thrift.transport.TTransportException) { + _LOGGER.error("TTransportException inside handler", e); + fb.close(); + return; + } else if (e instanceof org.apache.thrift.TApplicationException) { + _LOGGER.error("TApplicationException inside handler", e); + msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; + msg = (org.apache.thrift.TApplicationException)e; + } else { + _LOGGER.error("Exception inside handler", e); + msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION; + msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage()); + } + try { + fcall.sendResponse(fb,msg,msgType,seqid); + } catch (java.lang.Exception ex) { + _LOGGER.error("Exception writing to internal frame buffer", ex); + fb.close(); + } + } + }; + } + + @Override + public boolean isOneway() { + return false; + } + + @Override + public void start(I iface, sayHello_args args, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException { + iface.sayHello(args.name,resultHandler); + } + } + + } + + @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) + public static class sayHello_args implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("sayHello_args"); + + private static final org.apache.thrift.protocol.TField NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("name", org.apache.thrift.protocol.TType.STRING, (short)1); + + private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new sayHello_argsStandardSchemeFactory(); + private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new sayHello_argsTupleSchemeFactory(); + + public @org.apache.thrift.annotation.Nullable java.lang.String name; // required + + /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ + public enum _Fields implements org.apache.thrift.TFieldIdEnum { + NAME((short)1, "name"); + + private static final java.util.Map byName = new java.util.HashMap(); + + static { + for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { + byName.put(field.getFieldName(), field); + } + } + + /** + * Find the _Fields constant that matches fieldId, or null if its not found. + */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByThriftId(int fieldId) { + switch(fieldId) { + case 1: // NAME + return NAME; + default: + return null; + } + } + + /** + * Find the _Fields constant that matches fieldId, throwing an exception + * if it is not found. + */ + public static _Fields findByThriftIdOrThrow(int fieldId) { + _Fields fields = findByThriftId(fieldId); + if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); + return fields; + } + + /** + * Find the _Fields constant that matches name, or null if its not found. + */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByName(java.lang.String name) { + return byName.get(name); + } + + private final short _thriftId; + private final java.lang.String _fieldName; + + _Fields(short thriftId, java.lang.String fieldName) { + _thriftId = thriftId; + _fieldName = fieldName; + } + + @Override + public short getThriftFieldId() { + return _thriftId; + } + + @Override + public java.lang.String getFieldName() { + return _fieldName; + } + } + + // isset id assignments + public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; + static { + java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + tmpMap.put(_Fields.NAME, new org.apache.thrift.meta_data.FieldMetaData("name", org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))); + metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(sayHello_args.class, metaDataMap); + } + + public sayHello_args() { + } + + public sayHello_args( + java.lang.String name) + { + this(); + this.name = name; + } + + /** + * Performs a deep copy on other. + */ + public sayHello_args(sayHello_args other) { + if (other.isSetName()) { + this.name = other.name; + } + } + + @Override + public sayHello_args deepCopy() { + return new sayHello_args(this); + } + + @Override + public void clear() { + this.name = null; + } + + @org.apache.thrift.annotation.Nullable + public java.lang.String getName() { + return this.name; + } + + public sayHello_args setName(@org.apache.thrift.annotation.Nullable java.lang.String name) { + this.name = name; + return this; + } + + public void unsetName() { + this.name = null; + } + + /** Returns true if field name is set (has been assigned a value) and false otherwise */ + public boolean isSetName() { + return this.name != null; + } + + public void setNameIsSet(boolean value) { + if (!value) { + this.name = null; + } + } + + @Override + public void setFieldValue(_Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { + switch (field) { + case NAME: + if (value == null) { + unsetName(); + } else { + setName((java.lang.String)value); + } + break; + + } + } + + @org.apache.thrift.annotation.Nullable + @Override + public java.lang.Object getFieldValue(_Fields field) { + switch (field) { + case NAME: + return getName(); + + } + throw new java.lang.IllegalStateException(); + } + + /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ + @Override + public boolean isSet(_Fields field) { + if (field == null) { + throw new java.lang.IllegalArgumentException(); + } + + switch (field) { + case NAME: + return isSetName(); + } + throw new java.lang.IllegalStateException(); + } + + @Override + public boolean equals(java.lang.Object that) { + if (that instanceof sayHello_args) + return this.equals((sayHello_args)that); + return false; + } + + public boolean equals(sayHello_args that) { + if (that == null) + return false; + if (this == that) + return true; + + boolean this_present_name = true && this.isSetName(); + boolean that_present_name = true && that.isSetName(); + if (this_present_name || that_present_name) { + if (!(this_present_name && that_present_name)) + return false; + if (!this.name.equals(that.name)) + return false; + } + + return true; + } + + @Override + public int hashCode() { + int hashCode = 1; + + hashCode = hashCode * 8191 + ((isSetName()) ? 131071 : 524287); + if (isSetName()) + hashCode = hashCode * 8191 + name.hashCode(); + + return hashCode; + } + + @Override + public int compareTo(sayHello_args other) { + if (!getClass().equals(other.getClass())) { + return getClass().getName().compareTo(other.getClass().getName()); + } + + int lastComparison = 0; + + lastComparison = java.lang.Boolean.compare(isSetName(), other.isSetName()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetName()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.name, other.name); + if (lastComparison != 0) { + return lastComparison; + } + } + return 0; + } + + @org.apache.thrift.annotation.Nullable + @Override + public _Fields fieldForId(int fieldId) { + return _Fields.findByThriftId(fieldId); + } + + @Override + public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { + scheme(iprot).read(iprot, this); + } + + @Override + public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { + scheme(oprot).write(oprot, this); + } + + @Override + public java.lang.String toString() { + java.lang.StringBuilder sb = new java.lang.StringBuilder("sayHello_args("); + boolean first = true; + + sb.append("name:"); + if (this.name == null) { + sb.append("null"); + } else { + sb.append(this.name); + } + first = false; + sb.append(")"); + return sb.toString(); + } + + public void validate() throws org.apache.thrift.TException { + // check for required fields + // check for sub-struct validity + } + + private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { + try { + write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException { + try { + read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private static class sayHello_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { + @Override + public sayHello_argsStandardScheme getScheme() { + return new sayHello_argsStandardScheme(); + } + } + + private static class sayHello_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme { + + @Override + public void read(org.apache.thrift.protocol.TProtocol iprot, sayHello_args struct) throws org.apache.thrift.TException { + org.apache.thrift.protocol.TField schemeField; + iprot.readStructBegin(); + while (true) + { + schemeField = iprot.readFieldBegin(); + if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { + break; + } + switch (schemeField.id) { + case 1: // NAME + if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { + struct.name = iprot.readString(); + struct.setNameIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + default: + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + iprot.readFieldEnd(); + } + iprot.readStructEnd(); + + // check for required fields of primitive type, which can't be checked in the validate method + struct.validate(); + } + + @Override + public void write(org.apache.thrift.protocol.TProtocol oprot, sayHello_args struct) throws org.apache.thrift.TException { + struct.validate(); + + oprot.writeStructBegin(STRUCT_DESC); + if (struct.name != null) { + oprot.writeFieldBegin(NAME_FIELD_DESC); + oprot.writeString(struct.name); + oprot.writeFieldEnd(); + } + oprot.writeFieldStop(); + oprot.writeStructEnd(); + } + + } + + private static class sayHello_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { + @Override + public sayHello_argsTupleScheme getScheme() { + return new sayHello_argsTupleScheme(); + } + } + + private static class sayHello_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme { + + @Override + public void write(org.apache.thrift.protocol.TProtocol prot, sayHello_args struct) throws org.apache.thrift.TException { + org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot; + java.util.BitSet optionals = new java.util.BitSet(); + if (struct.isSetName()) { + optionals.set(0); + } + oprot.writeBitSet(optionals, 1); + if (struct.isSetName()) { + oprot.writeString(struct.name); + } + } + + @Override + public void read(org.apache.thrift.protocol.TProtocol prot, sayHello_args struct) throws org.apache.thrift.TException { + org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot; + java.util.BitSet incoming = iprot.readBitSet(1); + if (incoming.get(0)) { + struct.name = iprot.readString(); + struct.setNameIsSet(true); + } + } + } + + private static S scheme(org.apache.thrift.protocol.TProtocol proto) { + return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme(); + } + } + + @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) + public static class sayHello_result implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { + private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("sayHello_result"); + + private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.STRING, (short)0); + + private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new sayHello_resultStandardSchemeFactory(); + private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new sayHello_resultTupleSchemeFactory(); + + public @org.apache.thrift.annotation.Nullable java.lang.String success; // required + + /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ + public enum _Fields implements org.apache.thrift.TFieldIdEnum { + SUCCESS((short)0, "success"); + + private static final java.util.Map byName = new java.util.HashMap(); + + static { + for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) { + byName.put(field.getFieldName(), field); + } + } + + /** + * Find the _Fields constant that matches fieldId, or null if its not found. + */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByThriftId(int fieldId) { + switch(fieldId) { + case 0: // SUCCESS + return SUCCESS; + default: + return null; + } + } + + /** + * Find the _Fields constant that matches fieldId, throwing an exception + * if it is not found. + */ + public static _Fields findByThriftIdOrThrow(int fieldId) { + _Fields fields = findByThriftId(fieldId); + if (fields == null) throw new java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!"); + return fields; + } + + /** + * Find the _Fields constant that matches name, or null if its not found. + */ + @org.apache.thrift.annotation.Nullable + public static _Fields findByName(java.lang.String name) { + return byName.get(name); + } + + private final short _thriftId; + private final java.lang.String _fieldName; + + _Fields(short thriftId, java.lang.String fieldName) { + _thriftId = thriftId; + _fieldName = fieldName; + } + + @Override + public short getThriftFieldId() { + return _thriftId; + } + + @Override + public java.lang.String getFieldName() { + return _fieldName; + } + } + + // isset id assignments + public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; + static { + java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); + tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))); + metaDataMap = java.util.Collections.unmodifiableMap(tmpMap); + org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(sayHello_result.class, metaDataMap); + } + + public sayHello_result() { + } + + public sayHello_result( + java.lang.String success) + { + this(); + this.success = success; + } + + /** + * Performs a deep copy on other. + */ + public sayHello_result(sayHello_result other) { + if (other.isSetSuccess()) { + this.success = other.success; + } + } + + @Override + public sayHello_result deepCopy() { + return new sayHello_result(this); + } + + @Override + public void clear() { + this.success = null; + } + + @org.apache.thrift.annotation.Nullable + public java.lang.String getSuccess() { + return this.success; + } + + public sayHello_result setSuccess(@org.apache.thrift.annotation.Nullable java.lang.String success) { + this.success = success; + return this; + } + + public void unsetSuccess() { + this.success = null; + } + + /** Returns true if field success is set (has been assigned a value) and false otherwise */ + public boolean isSetSuccess() { + return this.success != null; + } + + public void setSuccessIsSet(boolean value) { + if (!value) { + this.success = null; + } + } + + @Override + public void setFieldValue(_Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) { + switch (field) { + case SUCCESS: + if (value == null) { + unsetSuccess(); + } else { + setSuccess((java.lang.String)value); + } + break; + + } + } + + @org.apache.thrift.annotation.Nullable + @Override + public java.lang.Object getFieldValue(_Fields field) { + switch (field) { + case SUCCESS: + return getSuccess(); + + } + throw new java.lang.IllegalStateException(); + } + + /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */ + @Override + public boolean isSet(_Fields field) { + if (field == null) { + throw new java.lang.IllegalArgumentException(); + } + + switch (field) { + case SUCCESS: + return isSetSuccess(); + } + throw new java.lang.IllegalStateException(); + } + + @Override + public boolean equals(java.lang.Object that) { + if (that instanceof sayHello_result) + return this.equals((sayHello_result)that); + return false; + } + + public boolean equals(sayHello_result that) { + if (that == null) + return false; + if (this == that) + return true; + + boolean this_present_success = true && this.isSetSuccess(); + boolean that_present_success = true && that.isSetSuccess(); + if (this_present_success || that_present_success) { + if (!(this_present_success && that_present_success)) + return false; + if (!this.success.equals(that.success)) + return false; + } + + return true; + } + + @Override + public int hashCode() { + int hashCode = 1; + + hashCode = hashCode * 8191 + ((isSetSuccess()) ? 131071 : 524287); + if (isSetSuccess()) + hashCode = hashCode * 8191 + success.hashCode(); + + return hashCode; + } + + @Override + public int compareTo(sayHello_result other) { + if (!getClass().equals(other.getClass())) { + return getClass().getName().compareTo(other.getClass().getName()); + } + + int lastComparison = 0; + + lastComparison = java.lang.Boolean.compare(isSetSuccess(), other.isSetSuccess()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetSuccess()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success); + if (lastComparison != 0) { + return lastComparison; + } + } + return 0; + } + + @org.apache.thrift.annotation.Nullable + @Override + public _Fields fieldForId(int fieldId) { + return _Fields.findByThriftId(fieldId); + } + + @Override + public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException { + scheme(iprot).read(iprot, this); + } + + public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException { + scheme(oprot).write(oprot, this); + } + + @Override + public java.lang.String toString() { + java.lang.StringBuilder sb = new java.lang.StringBuilder("sayHello_result("); + boolean first = true; + + sb.append("success:"); + if (this.success == null) { + sb.append("null"); + } else { + sb.append(this.success); + } + first = false; + sb.append(")"); + return sb.toString(); + } + + public void validate() throws org.apache.thrift.TException { + // check for required fields + // check for sub-struct validity + } + + private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { + try { + write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException { + try { + read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); + } catch (org.apache.thrift.TException te) { + throw new java.io.IOException(te); + } + } + + private static class sayHello_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { + @Override + public sayHello_resultStandardScheme getScheme() { + return new sayHello_resultStandardScheme(); + } + } + + private static class sayHello_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme { + + @Override + public void read(org.apache.thrift.protocol.TProtocol iprot, sayHello_result struct) throws org.apache.thrift.TException { + org.apache.thrift.protocol.TField schemeField; + iprot.readStructBegin(); + while (true) + { + schemeField = iprot.readFieldBegin(); + if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { + break; + } + switch (schemeField.id) { + case 0: // SUCCESS + if (schemeField.type == org.apache.thrift.protocol.TType.STRING) { + struct.success = iprot.readString(); + struct.setSuccessIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; + default: + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + iprot.readFieldEnd(); + } + iprot.readStructEnd(); + + // check for required fields of primitive type, which can't be checked in the validate method + struct.validate(); + } + + @Override + public void write(org.apache.thrift.protocol.TProtocol oprot, sayHello_result struct) throws org.apache.thrift.TException { + struct.validate(); + + oprot.writeStructBegin(STRUCT_DESC); + if (struct.success != null) { + oprot.writeFieldBegin(SUCCESS_FIELD_DESC); + oprot.writeString(struct.success); + oprot.writeFieldEnd(); + } + oprot.writeFieldStop(); + oprot.writeStructEnd(); + } + + } + + private static class sayHello_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory { + @Override + public sayHello_resultTupleScheme getScheme() { + return new sayHello_resultTupleScheme(); + } + } + + private static class sayHello_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme { + + @Override + public void write(org.apache.thrift.protocol.TProtocol prot, sayHello_result struct) throws org.apache.thrift.TException { + org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot; + java.util.BitSet optionals = new java.util.BitSet(); + if (struct.isSetSuccess()) { + optionals.set(0); + } + oprot.writeBitSet(optionals, 1); + if (struct.isSetSuccess()) { + oprot.writeString(struct.success); + } + } + + @Override + public void read(org.apache.thrift.protocol.TProtocol prot, sayHello_result struct) throws org.apache.thrift.TException { + org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot; + java.util.BitSet incoming = iprot.readBitSet(1); + if (incoming.get(0)) { + struct.success = iprot.readString(); + struct.setSuccessIsSet(true); + } + } + } + + private static S scheme(org.apache.thrift.protocol.TProtocol proto) { + return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme(); + } + } + +} diff --git a/example/example-adapter/example-adapter-thrift/src/main/resources/application.yml b/example/example-adapter/example-adapter-thrift/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..6aa4d18ab34eec03fb68d3a9cbc5f2c679bec9c1 --- /dev/null +++ b/example/example-adapter/example-adapter-thrift/src/main/resources/application.yml @@ -0,0 +1,59 @@ +server: + port: 9104 + +spring: + application: + name: dynamic-tp-adapter-thrift-demo + profiles: + active: dev + cloud: + nacos: + discovery: + server-addr: localhost:8848 + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: yml + extension-configs: + - dataId: ${spring.application.name}-dtp-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + group: DEFAULT_GROUP + refresh: true # 必须配置,负责自动刷新不生效 + refresh-enabled: true + +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + thriftTp: # thrift 线程池配置 + - threadPoolName: thriftTp#TThreadPoolServer#9998 + corePoolSize: 10 + maximumPoolSize: 20 + keepAliveTime: 60 + +thrift: + server: + port: 9998 + host: localhost + +# 开启 SpringBoot Actuator Endpoint 暴露出DynamicTp指标接口 +# 开启 prometheus 指标采集端点 +management: + metrics: + export: + prometheus: + enabled: true + endpoints: + web: + exposure: + include: '*' # 测试使用,线上不要用*,按需开启 diff --git a/example/example-adapter/example-adapter-thrift/src/main/thrift/SimpleService.thrift b/example/example-adapter/example-adapter-thrift/src/main/thrift/SimpleService.thrift new file mode 100644 index 0000000000000000000000000000000000000000..7f37e3a339c07422bb3ad7c4486501a633b28e84 --- /dev/null +++ b/example/example-adapter/example-adapter-thrift/src/main/thrift/SimpleService.thrift @@ -0,0 +1,5 @@ +namespace java org.dromara.dynamictp.example.thrift.service + +service SimpleService { + string sayHello(1: string name) +} diff --git a/example/example-adapter/example-adapter-webserver/pom.xml b/example/example-adapter/example-adapter-webserver/pom.xml index 21aa84c376a0887829a1e242478dc5206d07474f..22678456aaa521572f4c382355dda8fefa40a807 100644 --- a/example/example-adapter/example-adapter-webserver/pom.xml +++ b/example/example-adapter/example-adapter-webserver/pom.xml @@ -5,7 +5,7 @@ dynamic-tp-example-adapter org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter-webserver diff --git a/example/example-adapter/example-adapter-webserver/src/main/java/org/dromara/dynamictp/example/WebserverExampleApplication.java b/example/example-adapter/example-adapter-webserver/src/main/java/org/dromara/dynamictp/example/WebserverExampleApplication.java index ffcbfa2fe2ab179b8b46438a2e15c62b87e77f10..5334f6c3f519ef57e2668f86361d7d20511df3cb 100644 --- a/example/example-adapter/example-adapter-webserver/src/main/java/org/dromara/dynamictp/example/WebserverExampleApplication.java +++ b/example/example-adapter/example-adapter-webserver/src/main/java/org/dromara/dynamictp/example/WebserverExampleApplication.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/example/example-adapter/example-adapter-webserver/src/main/resources/application.yml b/example/example-adapter/example-adapter-webserver/src/main/resources/application.yml index 54d8b6cf8a471be021d9613d6e6b39e4ce3821b7..91e1bae186e7a8d62266ca298c21e4a0cb103e11 100644 --- a/example/example-adapter/example-adapter-webserver/src/main/resources/application.yml +++ b/example/example-adapter/example-adapter-webserver/src/main/resources/application.yml @@ -27,45 +27,44 @@ spring: enable: true debug: false - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: logging,micrometer # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 32d7bf40-1353-4859 # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: a05f38f61fdc748df55957c # 替换 - secret: SEC0e93872f969493536 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - - platform: email - receivers: 123456@qq.com,789789@qq.com # 收件人 - tomcatTp: # tomcat webserver 线程池配置 - corePoolSize: 100 - maximumPoolSize: 200 - keepAliveTime: 60 - runTimeout: 200 - queueTimeout: 100 +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: logging,micrometer # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 32d7bf40-1353-4859 # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: a05f38f61fdc748df55957c # 替换 + secret: SEC0e93872f969493536 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + - platform: email + receivers: 123456@qq.com,789789@qq.com # 收件人 + tomcatTp: # tomcat webserver 线程池配置 + corePoolSize: 100 + maximumPoolSize: 200 + keepAliveTime: 60 + runTimeout: 200 + queueTimeout: 100 - jettyTp: # jetty webserver 线程池配置 - corePoolSize: 100 - maximumPoolSize: 200 - keepAliveTime: 60 - runTimeout: 200 - queueTimeout: 1000 + jettyTp: # jetty webserver 线程池配置 + corePoolSize: 100 + maximumPoolSize: 200 + keepAliveTime: 60 + runTimeout: 200 + queueTimeout: 1000 - undertowTp: # undertow webserver 线程池配置 - corePoolSize: 100 - maximumPoolSize: 200 - keepAliveTime: 60 - runTimeout: 20 - queueTimeout: 10 + undertowTp: # undertow webserver 线程池配置 + corePoolSize: 100 + maximumPoolSize: 200 + keepAliveTime: 60 + runTimeout: 20 + queueTimeout: 10 # 开启 SpringBoot Actuator Endpoint 暴露出DynamicTp指标接口 # 开启 prometheus 指标采集端点 diff --git a/example/example-adapter/pom.xml b/example/example-adapter/pom.xml index 1495938aae355f6d351aa4a017efc509655ca997..33fbdc6fe0487d76135590e25b2950841191f2c3 100644 --- a/example/example-adapter/pom.xml +++ b/example/example-adapter/pom.xml @@ -5,7 +5,7 @@ dynamic-tp-example org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-adapter @@ -24,6 +24,9 @@ example-adapter-motan example-adapter-rocketmq example-adapter-rabbitmq + example-adapter-liteflow + example-adapter-webserver + example-adapter-thrift diff --git a/example/example-apollo/pom.xml b/example/example-apollo/pom.xml index 68c3436e46edafdd8ba59bed9d11fc2de85cb85e..0a2c2594edff5b64630d9d6cbcbcc426dfe9da46 100644 --- a/example/example-apollo/pom.xml +++ b/example/example-apollo/pom.xml @@ -6,7 +6,7 @@ dynamic-tp-example org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-apollo @@ -19,6 +19,12 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + org.springframework.boot @@ -27,16 +33,29 @@ org.dromara.dynamictp dynamic-tp-spring-boot-starter-apollo - ${revision} + 1.2.1 + + + org.dromara.dynamictp + dynamic-tp-extension-agent org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-webserver - ${revision} + 1.2.1 com.ctrip.framework.apollo apollo-client + + org.springframework.boot + spring-boot-starter-undertow + + + + io.micrometer + micrometer-registry-prometheus + \ No newline at end of file diff --git a/example/example-apollo/src/main/java/org/dromara/dynamictp/example/ApolloExampleApplication.java b/example/example-apollo/src/main/java/org/dromara/dynamictp/example/ApolloExampleApplication.java index 934ea24763e8c4c8c2c424b22396782050a3b93c..b05d9ee10ca5ad3c10c3d7015b619d20edbfeb78 100644 --- a/example/example-apollo/src/main/java/org/dromara/dynamictp/example/ApolloExampleApplication.java +++ b/example/example-apollo/src/main/java/org/dromara/dynamictp/example/ApolloExampleApplication.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/example/example-apollo/src/main/java/org/dromara/dynamictp/example/config/ThreadPoolConfiguration.java b/example/example-apollo/src/main/java/org/dromara/dynamictp/example/config/ThreadPoolConfiguration.java index ff51f8d24407cc0aa6d172dca06c0fe2db9e6606..e33bc3c0a55f9da9c7ae4ad439a1588fa17325df 100644 --- a/example/example-apollo/src/main/java/org/dromara/dynamictp/example/config/ThreadPoolConfiguration.java +++ b/example/example-apollo/src/main/java/org/dromara/dynamictp/example/config/ThreadPoolConfiguration.java @@ -17,6 +17,7 @@ package org.dromara.dynamictp.example.config; +import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.core.executor.DtpExecutor; import org.dromara.dynamictp.core.executor.OrderedDtpExecutor; import org.dromara.dynamictp.core.support.DynamicTp; @@ -37,6 +38,7 @@ import static org.dromara.dynamictp.common.em.RejectedTypeEnum.CALLER_RUNS_POLIC /** * @author Redick01 */ +@Slf4j @Configuration public class ThreadPoolConfiguration { @@ -59,7 +61,13 @@ public class ThreadPoolConfiguration { @DynamicTp("threadPoolTaskExecutor") @Bean public ThreadPoolTaskExecutor threadPoolTaskExecutor() { - return new ThreadPoolTaskExecutor(); + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setTaskDecorator(r -> () -> { + log.info("before execute"); + r.run(); + log.info("after execute"); + }); + return executor; } /** @@ -137,6 +145,7 @@ public class ThreadPoolConfiguration { return ThreadPoolBuilder.newBuilder() .threadPoolName("scheduledDtpExecutor") .corePoolSize(2) + .dynamic(true) .threadFactory("test-scheduled") .rejectedExecutionHandler(CALLER_RUNS_POLICY.getName()) .buildScheduled(); diff --git a/example/example-apollo/src/main/java/org/dromara/dynamictp/example/interceptor/TestExecuteInterceptor.java b/example/example-apollo/src/main/java/org/dromara/dynamictp/example/interceptor/TestExecuteInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..0963df48c97965549a791d9061ad8d223f531792 --- /dev/null +++ b/example/example-apollo/src/main/java/org/dromara/dynamictp/example/interceptor/TestExecuteInterceptor.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.example.interceptor; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.common.plugin.DtpInterceptor; +import org.dromara.dynamictp.common.plugin.DtpIntercepts; +import org.dromara.dynamictp.common.plugin.DtpInvocation; +import org.dromara.dynamictp.common.plugin.DtpSignature; +import org.dromara.dynamictp.core.executor.DtpExecutor; +import org.dromara.dynamictp.core.executor.ScheduledDtpExecutor; + +import java.lang.reflect.InvocationTargetException; + +/** + * TestExecuteInterceptor related + * + * @author yanhom + * @since 1.2.1 + */ +@DtpIntercepts( + name = "testExecuteInterceptor", + signatures = { + @DtpSignature(clazz = DtpExecutor.class, method = "execute", args = {Runnable.class}), + @DtpSignature(clazz = ScheduledDtpExecutor.class, method = "execute", args = {Runnable.class}) + } +) +@Slf4j +public class TestExecuteInterceptor implements DtpInterceptor { + + @Override + public Object intercept(DtpInvocation invocation) throws InvocationTargetException, IllegalAccessException { + + DtpExecutor dtpExecutor = (DtpExecutor) invocation.getTarget(); + String method = invocation.getMethod().getName(); + Object[] args = invocation.getArgs(); + log.info("TestExecuteInterceptor: dtpExecutor: {}, method: {}, args: {}", + dtpExecutor.getThreadPoolName(), method, args); + return invocation.proceed(); + } +} diff --git a/example/example-apollo/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java b/example/example-apollo/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java index 505ea7c13f4cf21fc753e84e561150063fe1b9b4..c7807ffea1f887689828545af634bce3c4734d4a 100644 --- a/example/example-apollo/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java +++ b/example/example-apollo/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java @@ -53,8 +53,9 @@ public class SmsNotifyConst { "上次报警时间:%s \n" + "报警时间:%s \n" + "接收人:@%s \n" + + "统计周期:%ss \n" + + "静默时长:%ss \n" + "trace 信息:%s \n" + - "报警间隔:%ss \n" + "扩展信息:%s \n"; public static final String SMS_NOTICE_TEMPLATE = diff --git a/example/example-apollo/src/main/resources/META-INF/services/org.dromara.dynamictp.common.plugin.DtpInterceptor b/example/example-apollo/src/main/resources/META-INF/services/org.dromara.dynamictp.common.plugin.DtpInterceptor new file mode 100644 index 0000000000000000000000000000000000000000..d4f4991a170157819c80faca5c9c43b4d77979c2 --- /dev/null +++ b/example/example-apollo/src/main/resources/META-INF/services/org.dromara.dynamictp.common.plugin.DtpInterceptor @@ -0,0 +1 @@ +org.dromara.dynamictp.example.interceptor.TestExecuteInterceptor \ No newline at end of file diff --git a/example/example-apollo/src/main/resources/dynamic-tp-apollo-demo-dtp.yml b/example/example-apollo/src/main/resources/dynamic-tp-apollo-demo-dtp.yml index 19aa09329a77e58b400ed5a6c7bc903433ee099f..4ef6440b535c0f8e82cd74c8d722c38218e649c1 100644 --- a/example/example-apollo/src/main/resources/dynamic-tp-apollo-demo-dtp.yml +++ b/example/example-apollo/src/main/resources/dynamic-tp-apollo-demo-dtp.yml @@ -1,84 +1,82 @@ # 动态线程池配置文件,建议单独开一个文件放到配置中心,字段详解看readme介绍 -spring: - dynamic: - tp: - enabled: true - enabledBanner: true # 是否开启banner打印,默认true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs - monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - tomcatTp: # tomcat web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - jettyTp: # jetty web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - undertowTp: # undertow web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - hystrixTp: # hystrix 线程池配置 - - threadPoolName: hystrix1 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - dubboTp: # dubbo 线程池配置 - - threadPoolName: dubboTp#20880 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - rocketMqTp: # rocketmq 线程池配置 - - threadPoolName: group1#topic1 - corePoolSize: 200 - maximumPoolSize: 400 - keepAliveTime: 60 - executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 - - threadPoolName: dtpExecutor1 - 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"] # 任务包装器名称,集成TaskWrapper接口 - 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 \ No newline at end of file +dynamictp: + enabled: true + enabledBanner: true # 是否开启banner打印,默认true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs + monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + tomcatTp: # tomcat web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + jettyTp: # jetty web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + undertowTp: # undertow web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + hystrixTp: # hystrix 线程池配置 + - threadPoolName: hystrix1 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + dubboTp: # dubbo 线程池配置 + - threadPoolName: dubboTp#20880 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + rocketMqTp: # rocketmq 线程池配置 + - threadPoolName: group1#topic1 + corePoolSize: 200 + maximumPoolSize: 400 + keepAliveTime: 60 + executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 + - threadPoolName: dtpExecutor1 + 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"] # 任务包装器名称,集成TaskWrapper接口 + 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 \ No newline at end of file diff --git a/example/example-consul-cloud/pom.xml b/example/example-consul-cloud/pom.xml index 710c1e42d992ac3dda6ebdcb2f738ade0061926f..1694341058c149f438f19898a5c0436cae34e117 100644 --- a/example/example-consul-cloud/pom.xml +++ b/example/example-consul-cloud/pom.xml @@ -6,7 +6,7 @@ dynamic-tp-example org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-consul-cloud @@ -44,13 +44,13 @@ org.dromara.dynamictp dynamic-tp-spring-cloud-starter-consul - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-webserver - ${revision} + 1.2.1 diff --git a/example/example-consul-cloud/src/main/java/org/dromara/dynamictp/example/CloudConsulExampleApplication.java b/example/example-consul-cloud/src/main/java/org/dromara/dynamictp/example/CloudConsulExampleApplication.java index 3ab775b0fffab955cc761efc60e9e273ec5a96f9..b2a84df290149f2f7d794e254f80523967a0b0e3 100644 --- a/example/example-consul-cloud/src/main/java/org/dromara/dynamictp/example/CloudConsulExampleApplication.java +++ b/example/example-consul-cloud/src/main/java/org/dromara/dynamictp/example/CloudConsulExampleApplication.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -26,10 +26,10 @@ import org.springframework.cloud.openfeign.EnableFeignClients; /** * @author Redick01 */ -@EnableDynamicTp @EnableFeignClients @MapperScan(basePackages = {"org.dromara.dynamictp.example.mapper"}) @SpringBootApplication +@EnableDynamicTp public class CloudConsulExampleApplication { public static void main(String[] args) { diff --git a/example/example-consul-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java b/example/example-consul-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java index 505ea7c13f4cf21fc753e84e561150063fe1b9b4..c7807ffea1f887689828545af634bce3c4734d4a 100644 --- a/example/example-consul-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java +++ b/example/example-consul-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java @@ -53,8 +53,9 @@ public class SmsNotifyConst { "上次报警时间:%s \n" + "报警时间:%s \n" + "接收人:@%s \n" + + "统计周期:%ss \n" + + "静默时长:%ss \n" + "trace 信息:%s \n" + - "报警间隔:%ss \n" + "扩展信息:%s \n"; public static final String SMS_NOTICE_TEMPLATE = diff --git a/example/example-consul-cloud/src/main/resources/dynamic-tp-cloud-consul-demo-dtp.yml b/example/example-consul-cloud/src/main/resources/dynamic-tp-cloud-consul-demo-dtp.yml index cfb19a1fe1c0b30366c7191777ad276483c34346..312298f9cf2f7cfd3d2730496398d3bc83627034 100644 --- a/example/example-consul-cloud/src/main/resources/dynamic-tp-cloud-consul-demo-dtp.yml +++ b/example/example-consul-cloud/src/main/resources/dynamic-tp-cloud-consul-demo-dtp.yml @@ -1,84 +1,82 @@ # 动态线程池配置文件,建议单独开一个文件放到配置中心,字段详解看readme介绍 -spring: - dynamic: - tp: - enabled: true - enabledBanner: true # 是否开启banner打印,默认true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs - monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - tomcatTp: # tomcat web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - jettyTp: # jetty web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - undertowTp: # undertow web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - hystrixTp: # hystrix 线程池配置 - - threadPoolName: hystrix1 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - dubboTp: # dubbo 线程池配置 - - threadPoolName: dubboTp#20880 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - rocketMqTp: # rocketmq 线程池配置 - - threadPoolName: group1#topic1 - corePoolSize: 200 - maximumPoolSize: 400 - keepAliveTime: 60 - executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 - - threadPoolName: dtpExecutor1 - 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"] # 任务包装器名称,集成TaskWrapper接口 - 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 \ No newline at end of file +dynamictp: + enabled: true + enabledBanner: true # 是否开启banner打印,默认true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs + monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + tomcatTp: # tomcat web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + jettyTp: # jetty web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + undertowTp: # undertow web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + hystrixTp: # hystrix 线程池配置 + - threadPoolName: hystrix1 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + dubboTp: # dubbo 线程池配置 + - threadPoolName: dubboTp#20880 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + rocketMqTp: # rocketmq 线程池配置 + - threadPoolName: group1#topic1 + corePoolSize: 200 + maximumPoolSize: 400 + keepAliveTime: 60 + executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 + - threadPoolName: dtpExecutor1 + 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"] # 任务包装器名称,集成TaskWrapper接口 + 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 \ No newline at end of file diff --git a/example/example-etcd/pom.xml b/example/example-etcd/pom.xml index e74079cd8980e4991925c08bab52bc44bbd3b7de..eb2e3ef0fb9b4bec3b345316b78a28de6f7c2dc0 100644 --- a/example/example-etcd/pom.xml +++ b/example/example-etcd/pom.xml @@ -5,7 +5,7 @@ dynamic-tp-example org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml 4.0.0 @@ -24,7 +24,7 @@ io.etcd jetcd-core - 0.7.1 + 0.7.2 \ No newline at end of file diff --git a/example/example-etcd/src/main/java/org/dromara/dynamictp/example/EtcdExampleApplication.java b/example/example-etcd/src/main/java/org/dromara/dynamictp/example/EtcdExampleApplication.java index 6e48831b6f62e130c4a88c3c0aa90bc31a84569e..ea791018aff72165b6a777ea530f646a71bf043e 100644 --- a/example/example-etcd/src/main/java/org/dromara/dynamictp/example/EtcdExampleApplication.java +++ b/example/example-etcd/src/main/java/org/dromara/dynamictp/example/EtcdExampleApplication.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/example/example-etcd/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java b/example/example-etcd/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java index 505ea7c13f4cf21fc753e84e561150063fe1b9b4..c7807ffea1f887689828545af634bce3c4734d4a 100644 --- a/example/example-etcd/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java +++ b/example/example-etcd/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java @@ -53,8 +53,9 @@ public class SmsNotifyConst { "上次报警时间:%s \n" + "报警时间:%s \n" + "接收人:@%s \n" + + "统计周期:%ss \n" + + "静默时长:%ss \n" + "trace 信息:%s \n" + - "报警间隔:%ss \n" + "扩展信息:%s \n"; public static final String SMS_NOTICE_TEMPLATE = diff --git a/example/example-etcd/src/main/resources/application.yml b/example/example-etcd/src/main/resources/application.yml index 812c1547a290578b6b81905a86c3f35935c4d307..3c1c7a7decec87b6e18ff61c8173e2d1955fc26a 100644 --- a/example/example-etcd/src/main/resources/application.yml +++ b/example/example-etcd/src/main/resources/application.yml @@ -2,16 +2,16 @@ server: port: 8888 spring: - dynamic: - tp: - config-type: properties - etcd: - endpoints: http://127.0.0.1:2379 - auth-enable: false - key: /config/dynamic-tp-etcd-demo application: name: dynamic-tp-etcd-demo +dynamictp: + config-type: properties + etcd: + endpoints: http://127.0.0.1:2379 + auth-enable: false + key: /config/dynamic-tp-etcd-demo + # 开启 SpringBoot Actuator Endpoint 暴露出DynamicTp指标接口 # 开启 prometheus 指标采集端点 management: diff --git a/example/example-huawei-cloud/pom.xml b/example/example-huawei-cloud/pom.xml index 956a0e99ec97362e8871abced32bde94e850a494..d950af91c176a53c0b140f28db61cc2e5d708118 100644 --- a/example/example-huawei-cloud/pom.xml +++ b/example/example-huawei-cloud/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-example - ${revision} + 1.2.1 ../pom.xml @@ -66,13 +66,13 @@ org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-webserver - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-cloud-starter-huawei - ${revision} + 1.2.1 diff --git a/example/example-huawei-cloud/src/main/java/org/dromara/dynamictp/example/HuaweiCloudExampleApplication.java b/example/example-huawei-cloud/src/main/java/org/dromara/dynamictp/example/HuaweiCloudExampleApplication.java index cc8de4699c9ae95ac3279b435c00ea9e7410c9bd..e3b2e52a8c5c7a91885b98645726870ac5019a4c 100644 --- a/example/example-huawei-cloud/src/main/java/org/dromara/dynamictp/example/HuaweiCloudExampleApplication.java +++ b/example/example-huawei-cloud/src/main/java/org/dromara/dynamictp/example/HuaweiCloudExampleApplication.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/example/example-huawei-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java b/example/example-huawei-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java index 505ea7c13f4cf21fc753e84e561150063fe1b9b4..c7807ffea1f887689828545af634bce3c4734d4a 100644 --- a/example/example-huawei-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java +++ b/example/example-huawei-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java @@ -53,8 +53,9 @@ public class SmsNotifyConst { "上次报警时间:%s \n" + "报警时间:%s \n" + "接收人:@%s \n" + + "统计周期:%ss \n" + + "静默时长:%ss \n" + "trace 信息:%s \n" + - "报警间隔:%ss \n" + "扩展信息:%s \n"; public static final String SMS_NOTICE_TEMPLATE = diff --git a/example/example-huawei-cloud/src/main/resources/dynamic-tp-huawei-cloud-demo-dtp-dev.yml b/example/example-huawei-cloud/src/main/resources/dynamic-tp-huawei-cloud-demo-dtp-dev.yml index 32d412772cb264c0e21f43119e7eebd640e2e391..02dbb9ba054695de385fc39e1bd27380cde0a3ef 100644 --- a/example/example-huawei-cloud/src/main/resources/dynamic-tp-huawei-cloud-demo-dtp-dev.yml +++ b/example/example-huawei-cloud/src/main/resources/dynamic-tp-huawei-cloud-demo-dtp-dev.yml @@ -1,84 +1,82 @@ # 动态线程池配置文件,建议单独开一个文件放到配置中心,字段详解看readme介绍 -spring: - dynamic: - tp: - enabled: true - enabledBanner: true # 是否开启banner打印,默认true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs - monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - tomcatTp: # tomcat web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - jettyTp: # jetty web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - undertowTp: # undertow web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - hystrixTp: # hystrix 线程池配置 - - threadPoolName: hystrix1 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - dubboTp: # dubbo 线程池配置 - - threadPoolName: dubboTp#20880 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - rocketMqTp: # rocketmq 线程池配置 - - threadPoolName: group1#topic1 - corePoolSize: 200 - maximumPoolSize: 400 - keepAliveTime: 60 - executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 - - threadPoolName: dtpExecutor1 - 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"] # 任务包装器名称,集成TaskWrapper接口 - 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 +dynamictp: + enabled: true + enabledBanner: true # 是否开启banner打印,默认true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs + monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + tomcatTp: # tomcat web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + jettyTp: # jetty web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + undertowTp: # undertow web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + hystrixTp: # hystrix 线程池配置 + - threadPoolName: hystrix1 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + dubboTp: # dubbo 线程池配置 + - threadPoolName: dubboTp#20880 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + rocketMqTp: # rocketmq 线程池配置 + - threadPoolName: group1#topic1 + corePoolSize: 200 + maximumPoolSize: 400 + keepAliveTime: 60 + executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 + - threadPoolName: dtpExecutor1 + 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"] # 任务包装器名称,集成TaskWrapper接口 + 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 diff --git a/example/example-nacos-cloud/pom.xml b/example/example-nacos-cloud/pom.xml index d5505a9b35f247fe4873a36ffe15499d23a41db1..e0d3eadf736ad7a19b776d4cd89bc60da8313df6 100644 --- a/example/example-nacos-cloud/pom.xml +++ b/example/example-nacos-cloud/pom.xml @@ -6,7 +6,7 @@ dynamic-tp-example org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-nacos-cloud @@ -62,19 +62,19 @@ org.dromara.dynamictp dynamic-tp-spring-cloud-starter-nacos - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-webserver - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-extension-limiter-redis - ${revision} + 1.2.1 diff --git a/example/example-nacos-cloud/src/main/java/org/dromara/dynamictp/example/NacosCloudExampleApplication.java b/example/example-nacos-cloud/src/main/java/org/dromara/dynamictp/example/NacosCloudExampleApplication.java index a6a9528c36263f9b6d4be20fb540c2d9b97f56fe..ea720b2180c93c74b1857f49ae6a0fc5896020d8 100644 --- a/example/example-nacos-cloud/src/main/java/org/dromara/dynamictp/example/NacosCloudExampleApplication.java +++ b/example/example-nacos-cloud/src/main/java/org/dromara/dynamictp/example/NacosCloudExampleApplication.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/example/example-nacos-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java b/example/example-nacos-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java index 505ea7c13f4cf21fc753e84e561150063fe1b9b4..c7807ffea1f887689828545af634bce3c4734d4a 100644 --- a/example/example-nacos-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java +++ b/example/example-nacos-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java @@ -53,8 +53,9 @@ public class SmsNotifyConst { "上次报警时间:%s \n" + "报警时间:%s \n" + "接收人:@%s \n" + + "统计周期:%ss \n" + + "静默时长:%ss \n" + "trace 信息:%s \n" + - "报警间隔:%ss \n" + "扩展信息:%s \n"; public static final String SMS_NOTICE_TEMPLATE = diff --git a/example/example-nacos-cloud/src/main/resources/dynamic-tp-nacos-cloud-demo-dtp-dev.yml b/example/example-nacos-cloud/src/main/resources/dynamic-tp-nacos-cloud-demo-dtp-dev.yml index f685ff628a200763228c53c639f66c0dc20a69f2..611a3e9cac41493447136e930282f2062d824522 100644 --- a/example/example-nacos-cloud/src/main/resources/dynamic-tp-nacos-cloud-demo-dtp-dev.yml +++ b/example/example-nacos-cloud/src/main/resources/dynamic-tp-nacos-cloud-demo-dtp-dev.yml @@ -1,94 +1,92 @@ # 动态线程池配置文件,建议单独开一个文件放到配置中心,字段详解看readme介绍 -spring: - dynamic: - tp: - enabled: true - enabledBanner: true # 是否开启banner打印,默认true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs - monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - tomcatTp: # tomcat web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - jettyTp: # jetty web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - undertowTp: # undertow web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - hystrixTp: # hystrix 线程池配置 - - threadPoolName: hystrix1 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - dubboTp: # dubbo 线程池配置 - - threadPoolName: dubboTp#20880 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - rocketMqTp: # rocketmq 线程池配置 - - threadPoolName: group1#topic1 - corePoolSize: 200 - maximumPoolSize: 400 - keepAliveTime: 60 - executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 - - threadPoolName: dtpExecutor1 - 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"] # 任务包装器名称,集成TaskWrapper接口 - 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 - - threadPoolName: orderedDtpExecutor - executorType: ordered - corePoolSize: 4 - maximumPoolSize: 6 - queueCapacity: 2000 - queueType: VariableLinkedBlockingQueue - rejectedHandlerType: CallerRunsPolicy - keepAliveTime: 50 - allowCoreThreadTimeOut: false - threadNamePrefix: test +dynamictp: + enabled: true + enabledBanner: true # 是否开启banner打印,默认true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs + monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + tomcatTp: # tomcat web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + jettyTp: # jetty web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + undertowTp: # undertow web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + hystrixTp: # hystrix 线程池配置 + - threadPoolName: hystrix1 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + dubboTp: # dubbo 线程池配置 + - threadPoolName: dubboTp#20880 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + rocketMqTp: # rocketmq 线程池配置 + - threadPoolName: group1#topic1 + corePoolSize: 200 + maximumPoolSize: 400 + keepAliveTime: 60 + executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 + - threadPoolName: dtpExecutor1 + 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"] # 任务包装器名称,集成TaskWrapper接口 + 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 + - threadPoolName: orderedDtpExecutor + executorType: ordered + corePoolSize: 4 + maximumPoolSize: 6 + queueCapacity: 2000 + queueType: VariableLinkedBlockingQueue + rejectedHandlerType: CallerRunsPolicy + keepAliveTime: 50 + allowCoreThreadTimeOut: false + threadNamePrefix: test diff --git a/example/example-nacos/pom.xml b/example/example-nacos/pom.xml index 0ae1becea9fdeaa4f600dc198840c82220b44ecb..de9f20a724477551c6ea368738487d7af1ff4939 100644 --- a/example/example-nacos/pom.xml +++ b/example/example-nacos/pom.xml @@ -6,7 +6,7 @@ dynamic-tp-example org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-nacos @@ -39,17 +39,17 @@ com.alibaba.nacos nacos-client - 1.4.6 + 1.4.7 org.dromara.dynamictp dynamic-tp-spring-boot-starter-nacos - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-webserver - ${revision} + 1.2.1 diff --git a/example/example-nacos/src/main/java/org/dromara/dynamictp/example/NacosExampleApplication.java b/example/example-nacos/src/main/java/org/dromara/dynamictp/example/NacosExampleApplication.java index 064c8471cfec758da82498fd7f4382e693199506..1ca14c7d56882ca41f223402b37790f8229e9826 100644 --- a/example/example-nacos/src/main/java/org/dromara/dynamictp/example/NacosExampleApplication.java +++ b/example/example-nacos/src/main/java/org/dromara/dynamictp/example/NacosExampleApplication.java @@ -17,15 +17,15 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author Redick01 */ -@EnableDynamicTp @SpringBootApplication +@EnableDynamicTp public class NacosExampleApplication { public static void main(String[] args) { diff --git a/example/example-nacos/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java b/example/example-nacos/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java index 505ea7c13f4cf21fc753e84e561150063fe1b9b4..c7807ffea1f887689828545af634bce3c4734d4a 100644 --- a/example/example-nacos/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java +++ b/example/example-nacos/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java @@ -53,8 +53,9 @@ public class SmsNotifyConst { "上次报警时间:%s \n" + "报警时间:%s \n" + "接收人:@%s \n" + + "统计周期:%ss \n" + + "静默时长:%ss \n" + "trace 信息:%s \n" + - "报警间隔:%ss \n" + "扩展信息:%s \n"; public static final String SMS_NOTICE_TEMPLATE = diff --git a/example/example-nacos/src/main/resources/dynamic-tp-nacos-demo-dtp-dev.yml b/example/example-nacos/src/main/resources/dynamic-tp-nacos-demo-dtp-dev.yml index 74d407cb62326aeee587c8708794f5a7f15fef4a..c9f2ab218320d100d48ec2ea548261c2cc7f283d 100644 --- a/example/example-nacos/src/main/resources/dynamic-tp-nacos-demo-dtp-dev.yml +++ b/example/example-nacos/src/main/resources/dynamic-tp-nacos-demo-dtp-dev.yml @@ -1,84 +1,82 @@ # 动态线程池配置文件,建议单独开一个文件放到配置中心,字段详解看readme介绍 -spring: - dynamic: - tp: - enabled: true - enabledBanner: true # 是否开启banner打印,默认true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: micrometer,logging,endpoint # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs - monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - tomcatTp: # tomcat web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - jettyTp: # jetty web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - undertowTp: # undertow web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - hystrixTp: # hystrix 线程池配置 - - threadPoolName: hystrix1 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - dubboTp: # dubbo 线程池配置 - - threadPoolName: dubboTp#20880 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - rocketMqTp: # rocketmq 线程池配置 - - threadPoolName: group1#topic1 - corePoolSize: 200 - maximumPoolSize: 400 - keepAliveTime: 60 - executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 - - threadPoolName: dtpExecutorExample1 - 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"] # 任务包装器名称,集成TaskWrapper接口 - notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警) - - type: capacity # 报警项类型,查看源码 NotifyItemEnum枚举类 - 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 +dynamictp: + enabled: true + enabledBanner: true # 是否开启banner打印,默认true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: micrometer,logging,endpoint # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs + monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + tomcatTp: # tomcat web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + jettyTp: # jetty web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + undertowTp: # undertow web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + hystrixTp: # hystrix 线程池配置 + - threadPoolName: hystrix1 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + dubboTp: # dubbo 线程池配置 + - threadPoolName: dubboTp#20880 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + rocketMqTp: # rocketmq 线程池配置 + - threadPoolName: group1#topic1 + corePoolSize: 200 + maximumPoolSize: 400 + keepAliveTime: 60 + executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 + - threadPoolName: dtpExecutorExample1 + 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"] # 任务包装器名称,集成TaskWrapper接口 + notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警) + - type: capacity # 报警项类型,查看源码 NotifyItemTypeRegistry + 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 diff --git a/example/example-polaris-cloud/pom.xml b/example/example-polaris-cloud/pom.xml index f3cbe931339bb6aae9710a7035dc7ec3d7230781..2c3002baa3cf55f4639098474e537d121d5b409f 100644 --- a/example/example-polaris-cloud/pom.xml +++ b/example/example-polaris-cloud/pom.xml @@ -6,7 +6,7 @@ dynamic-tp-example org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-polaris-cloud diff --git a/example/example-polaris-cloud/src/main/java/org/dromara/dynamictp/example/PolarisCloudExampleApplication.java b/example/example-polaris-cloud/src/main/java/org/dromara/dynamictp/example/PolarisCloudExampleApplication.java index aa2ecfb9d54b96a7af718348e48db9cc7e5e9ebf..05e4818b0cdf2fa0a1454f8a29a2869f48c528d8 100644 --- a/example/example-polaris-cloud/src/main/java/org/dromara/dynamictp/example/PolarisCloudExampleApplication.java +++ b/example/example-polaris-cloud/src/main/java/org/dromara/dynamictp/example/PolarisCloudExampleApplication.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/example/example-polaris-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java b/example/example-polaris-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java index 505ea7c13f4cf21fc753e84e561150063fe1b9b4..c7807ffea1f887689828545af634bce3c4734d4a 100644 --- a/example/example-polaris-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java +++ b/example/example-polaris-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java @@ -53,8 +53,9 @@ public class SmsNotifyConst { "上次报警时间:%s \n" + "报警时间:%s \n" + "接收人:@%s \n" + + "统计周期:%ss \n" + + "静默时长:%ss \n" + "trace 信息:%s \n" + - "报警间隔:%ss \n" + "扩展信息:%s \n"; public static final String SMS_NOTICE_TEMPLATE = diff --git a/example/example-polaris-cloud/src/main/resources/dynamic-tp-polaris-cloud-demo-dtp-dev.yml b/example/example-polaris-cloud/src/main/resources/dynamic-tp-polaris-cloud-demo-dtp-dev.yml index 32d412772cb264c0e21f43119e7eebd640e2e391..02dbb9ba054695de385fc39e1bd27380cde0a3ef 100644 --- a/example/example-polaris-cloud/src/main/resources/dynamic-tp-polaris-cloud-demo-dtp-dev.yml +++ b/example/example-polaris-cloud/src/main/resources/dynamic-tp-polaris-cloud-demo-dtp-dev.yml @@ -1,84 +1,82 @@ # 动态线程池配置文件,建议单独开一个文件放到配置中心,字段详解看readme介绍 -spring: - dynamic: - tp: - enabled: true - enabledBanner: true # 是否开启banner打印,默认true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs - monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - tomcatTp: # tomcat web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - jettyTp: # jetty web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - undertowTp: # undertow web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - hystrixTp: # hystrix 线程池配置 - - threadPoolName: hystrix1 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - dubboTp: # dubbo 线程池配置 - - threadPoolName: dubboTp#20880 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - rocketMqTp: # rocketmq 线程池配置 - - threadPoolName: group1#topic1 - corePoolSize: 200 - maximumPoolSize: 400 - keepAliveTime: 60 - executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 - - threadPoolName: dtpExecutor1 - 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"] # 任务包装器名称,集成TaskWrapper接口 - 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 +dynamictp: + enabled: true + enabledBanner: true # 是否开启banner打印,默认true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs + monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + tomcatTp: # tomcat web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + jettyTp: # jetty web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + undertowTp: # undertow web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + hystrixTp: # hystrix 线程池配置 + - threadPoolName: hystrix1 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + dubboTp: # dubbo 线程池配置 + - threadPoolName: dubboTp#20880 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + rocketMqTp: # rocketmq 线程池配置 + - threadPoolName: group1#topic1 + corePoolSize: 200 + maximumPoolSize: 400 + keepAliveTime: 60 + executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 + - threadPoolName: dtpExecutor1 + 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"] # 任务包装器名称,集成TaskWrapper接口 + 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 diff --git a/example/example-zookeeper-cloud/pom.xml b/example/example-zookeeper-cloud/pom.xml index 34cef6a201e3eb5fd8683a70ee3f3f14cf41cd33..7c172ca61e46216117c672907960d3c68d8c3df5 100644 --- a/example/example-zookeeper-cloud/pom.xml +++ b/example/example-zookeeper-cloud/pom.xml @@ -6,7 +6,7 @@ dynamic-tp-example org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-zookeeper-cloud @@ -35,13 +35,13 @@ org.dromara.dynamictp dynamic-tp-spring-cloud-starter-zookeeper - ${revision} + 1.2.1 org.dromara.dynamictp dynamic-tp-spring-boot-starter-adapter-webserver - ${revision} + 1.2.1 diff --git a/example/example-zookeeper-cloud/src/main/java/org/dromara/dynamictp/example/CloudZookeeperExampleApplication.java b/example/example-zookeeper-cloud/src/main/java/org/dromara/dynamictp/example/CloudZookeeperExampleApplication.java index 271633f1373fc96f8b68d07ad0d2a92f9b2e2280..833aa82908e6c43336e8bf68b8d80e43408a4de4 100644 --- a/example/example-zookeeper-cloud/src/main/java/org/dromara/dynamictp/example/CloudZookeeperExampleApplication.java +++ b/example/example-zookeeper-cloud/src/main/java/org/dromara/dynamictp/example/CloudZookeeperExampleApplication.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/example/example-zookeeper-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java b/example/example-zookeeper-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java index 505ea7c13f4cf21fc753e84e561150063fe1b9b4..c7807ffea1f887689828545af634bce3c4734d4a 100644 --- a/example/example-zookeeper-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java +++ b/example/example-zookeeper-cloud/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java @@ -53,8 +53,9 @@ public class SmsNotifyConst { "上次报警时间:%s \n" + "报警时间:%s \n" + "接收人:@%s \n" + + "统计周期:%ss \n" + + "静默时长:%ss \n" + "trace 信息:%s \n" + - "报警间隔:%ss \n" + "扩展信息:%s \n"; public static final String SMS_NOTICE_TEMPLATE = diff --git a/example/example-zookeeper-cloud/src/main/resources/config.txt b/example/example-zookeeper-cloud/src/main/resources/config.txt index 82f45e19607ad96cbada61a24704ed82e2fe6ba4..12c02bd94890196e105393aa5499522692d62840 100644 --- a/example/example-zookeeper-cloud/src/main/resources/config.txt +++ b/example/example-zookeeper-cloud/src/main/resources/config.txt @@ -1,69 +1,69 @@ -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.enabled=true -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.enabledBanner=true -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.enabledCollect=true -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.collectorType=logging -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.monitorInterval=5 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].threadPoolName=dtpExecutor1 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].corePoolSize=50 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].maximumPoolSize=50 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].queueCapacity=3000 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].queueType=VariableLinkedBlockingQueue -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].rejectedHandlerType=CallerRunsPolicy -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].keepAliveTime=50 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].allowCoreThreadTimeOut=true -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].threadNamePrefix=test1 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[0].type=capacity -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[0].enabled=true -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[0].threshold=80 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[0].platforms[0]=ding -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[0].platforms[1]=wechat -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[0].interval=120 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[1].type=change -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[1].enabled=true -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[2].type=liveness -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[2].enabled=true -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[2].threshold=80 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[3].type=reject -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[3].enabled=true -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[0].notifyItems[3].threshold=1 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].threadPoolName=dtpExecutor2 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].corePoolSize=20 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].maximumPoolSize=30 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].queueCapacity=1000 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].queueType=VariableLinkedBlockingQueue -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].rejectedHandlerType=CallerRunsPolicy -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].keepAliveTime=50 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].allowCoreThreadTimeOut=true -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].threadNamePrefix=test2 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[0].type=capacity -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[0].enabled=true -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[0].threshold=80 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[0].platforms[0]=ding -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[0].platforms[1]=wechat -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[0].interval=120 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[1].type=change -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[1].enabled=true -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[2].type=liveness -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[2].enabled=true -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[2].threshold=80 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[3].type=reject -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[3].enabled=true -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.executors[1].notifyItems[3].threshold=1 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.enabled=true +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.enabledBanner=true +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.enabledCollect=true +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.collectorType=logging +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.monitorInterval=5 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].threadPoolName=dtpExecutor1 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].corePoolSize=50 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].maximumPoolSize=50 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].queueCapacity=3000 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].queueType=VariableLinkedBlockingQueue +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].rejectedHandlerType=CallerRunsPolicy +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].keepAliveTime=50 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].allowCoreThreadTimeOut=true +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].threadNamePrefix=test1 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[0].type=capacity +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[0].enabled=true +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[0].threshold=80 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[0].platforms[0]=ding +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[0].platforms[1]=wechat +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[0].interval=120 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[1].type=change +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[1].enabled=true +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[2].type=liveness +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[2].enabled=true +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[2].threshold=80 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[3].type=reject +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[3].enabled=true +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[0].notifyItems[3].threshold=1 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].threadPoolName=dtpExecutor2 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].corePoolSize=20 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].maximumPoolSize=30 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].queueCapacity=1000 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].queueType=VariableLinkedBlockingQueue +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].rejectedHandlerType=CallerRunsPolicy +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].keepAliveTime=50 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].allowCoreThreadTimeOut=true +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].threadNamePrefix=test2 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[0].type=capacity +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[0].enabled=true +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[0].threshold=80 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[0].platforms[0]=ding +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[0].platforms[1]=wechat +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[0].interval=120 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[1].type=change +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[1].enabled=true +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[2].type=liveness +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[2].enabled=true +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[2].threshold=80 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[3].type=reject +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[3].enabled=true +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.executors[1].notifyItems[3].threshold=1 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.platforms[0].platform=wechat -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.platforms[0].urlKey=38a7e53d8b649c -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.platforms[0].receivers=test -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.platforms[1].platform=ding -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.platforms[1].urlKey=f80dad44d4a8801d593604f4a08dcd6a -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.platforms[1].secret=SECb5444f2c8346741fa6f375d5b9d21 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.platforms[1].receivers=18888888888 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.platforms[0].platform=wechat +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.platforms[0].urlKey=38a7e53d8b649c +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.platforms[0].receivers=test +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.platforms[1].platform=ding +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.platforms[1].urlKey=f80dad44d4a8801d593604f4a08dcd6a +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.platforms[1].secret=SECb5444f2c8346741fa6f375d5b9d21 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.platforms[1].receivers=18888888888 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.dubboTp[0].threadPoolName=dubboTp#20880 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.dubboTp[0].corePoolSize=100 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.dubboTp[0].maximumPoolSize=400 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.dubboTp[0].keepAliveTime=40 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.dubboTp[0].threadPoolName=dubboTp#20880 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.dubboTp[0].corePoolSize=100 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.dubboTp[0].maximumPoolSize=400 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.dubboTp[0].keepAliveTime=40 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.rocketMqTp[0].threadPoolName=test#test -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.rocketMqTp[0].corePoolSize=100 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.rocketMqTp[0].maximumPoolSize=400 -/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=spring.dynamic.tp.rocketMqTp[0].keepAliveTime=40 \ No newline at end of file +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.rocketMqTp[0].threadPoolName=test#test +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.rocketMqTp[0].corePoolSize=100 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.rocketMqTp[0].maximumPoolSize=400 +/configserver/dev/dynamic-tp-cloud-zookeeper-demo,dev=dynamictp.rocketMqTp[0].keepAliveTime=40 \ No newline at end of file diff --git a/example/example-zookeeper/pom.xml b/example/example-zookeeper/pom.xml index a305e330574953390421f2c8daec1d24d1ec1ad6..dfb59f21d6570f78f93e64fee3c86d336c48ff93 100644 --- a/example/example-zookeeper/pom.xml +++ b/example/example-zookeeper/pom.xml @@ -6,7 +6,7 @@ dynamic-tp-example org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example-zookeeper @@ -27,7 +27,7 @@ org.dromara.dynamictp dynamic-tp-spring-boot-starter-zookeeper - ${revision} + 1.2.1 org.apache.curator diff --git a/example/example-zookeeper/src/main/java/org/dromara/dynamictp/example/ZookeeperExampleApplication.java b/example/example-zookeeper/src/main/java/org/dromara/dynamictp/example/ZookeeperExampleApplication.java index 7d5b6bda208b16ff900834ebcb9d0df71ab00301..ea5c471231e7bd644a471feb12407b2a3b890195 100644 --- a/example/example-zookeeper/src/main/java/org/dromara/dynamictp/example/ZookeeperExampleApplication.java +++ b/example/example-zookeeper/src/main/java/org/dromara/dynamictp/example/ZookeeperExampleApplication.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.example; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; diff --git a/example/example-zookeeper/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java b/example/example-zookeeper/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java index 505ea7c13f4cf21fc753e84e561150063fe1b9b4..c7807ffea1f887689828545af634bce3c4734d4a 100644 --- a/example/example-zookeeper/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java +++ b/example/example-zookeeper/src/main/java/org/dromara/dynamictp/example/notifier/SmsNotifyConst.java @@ -53,8 +53,9 @@ public class SmsNotifyConst { "上次报警时间:%s \n" + "报警时间:%s \n" + "接收人:@%s \n" + + "统计周期:%ss \n" + + "静默时长:%ss \n" + "trace 信息:%s \n" + - "报警间隔:%ss \n" + "扩展信息:%s \n"; public static final String SMS_NOTICE_TEMPLATE = diff --git a/example/example-zookeeper/src/main/resources/application.yml b/example/example-zookeeper/src/main/resources/application.yml index d565eaf49032e5d1105fc897f833c93794fdc1ba..b563334100d6d280c446268787ce30ac906f0ec8 100644 --- a/example/example-zookeeper/src/main/resources/application.yml +++ b/example/example-zookeeper/src/main/resources/application.yml @@ -4,14 +4,14 @@ server: spring: application: name: dynamic-tp-zookeeper-demo - dynamic: - tp: - config-type: json # zookeeper支持properties / json 配置 - zookeeper: - zk-connect-str: 127.0.0.1:2181 - root-node: /configserver/dev - node: dtp-group - config-key: dynamic-tp-zookeeper-demo-json # json 用到 + +dynamictp: + config-type: json # zookeeper支持properties / json 配置 + zookeeper: + zk-connect-str: 127.0.0.1:2181 + root-node: /configserver/dev + node: dtp-group + config-key: dynamic-tp-zookeeper-demo-json # json 用到 # 开启 SpringBoot Actuator Endpoint 暴露出DynamicTp指标接口 # 开启 prometheus 指标采集端点 diff --git a/example/example-zookeeper/src/main/resources/config.txt b/example/example-zookeeper/src/main/resources/config.txt index a06a901932ef116211d5c0dc338ce555d1058733..952a2fba89aa476f284e7927e4f9cb929105fb0a 100644 --- a/example/example-zookeeper/src/main/resources/config.txt +++ b/example/example-zookeeper/src/main/resources/config.txt @@ -1,51 +1,51 @@ -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.enabled=true -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.enabledBanner=true -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.enabledCollect=true -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.collectorType=logging -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.monitorInterval=5 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].threadPoolName=dtpExecutor1 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].corePoolSize=50 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].maximumPoolSize=50 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].queueCapacity=3000 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].queueType=VariableLinkedBlockingQueue -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].rejectedHandlerType=CallerRunsPolicy -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].keepAliveTime=50 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].allowCoreThreadTimeOut=false -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].threadNamePrefix=test1 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[0].type=capacity -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[0].enabled=false -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[0].threshold=80 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[0].platforms[0]=ding -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[0].platforms[1]=wechat -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[0].interval=120 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[1].type=change -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[1].enabled=false -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[2].type=liveness -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[2].enabled=false -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[2].threshold=80 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[3].type=reject -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[3].enabled=false -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[0].notifyItems[3].threshold=1 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].threadPoolName=dtpExecutor2 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].corePoolSize=20 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].maximumPoolSize=30 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].queueCapacity=1000 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].queueType=VariableLinkedBlockingQueue -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].rejectedHandlerType=CallerRunsPolicy -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].keepAliveTime=50 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].allowCoreThreadTimeOut=false -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].threadNamePrefix=test2 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[0].type=capacity -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[0].enabled=false -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[0].threshold=80 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[0].platforms[0]=ding -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[0].platforms[1]=wechat -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[0].interval=120 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[1].type=change -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[1].enabled=false -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[2].type=liveness -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[2].enabled=false -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[2].threshold=80 -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[3].type=reject -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[3].enabled=false -/configserver/dev/dynamic-tp-zookeeper-demo=spring.dynamic.tp.executors[1].notifyItems[3].threshold=1 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.enabled=true +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.enabledBanner=true +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.enabledCollect=true +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.collectorType=logging +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.monitorInterval=5 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].threadPoolName=dtpExecutor1 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].corePoolSize=50 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].maximumPoolSize=50 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].queueCapacity=3000 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].queueType=VariableLinkedBlockingQueue +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].rejectedHandlerType=CallerRunsPolicy +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].keepAliveTime=50 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].allowCoreThreadTimeOut=false +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].threadNamePrefix=test1 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[0].type=capacity +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[0].enabled=false +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[0].threshold=80 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[0].platforms[0]=ding +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[0].platforms[1]=wechat +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[0].interval=120 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[1].type=change +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[1].enabled=false +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[2].type=liveness +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[2].enabled=false +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[2].threshold=80 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[3].type=reject +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[3].enabled=false +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[0].notifyItems[3].threshold=1 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].threadPoolName=dtpExecutor2 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].corePoolSize=20 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].maximumPoolSize=30 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].queueCapacity=1000 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].queueType=VariableLinkedBlockingQueue +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].rejectedHandlerType=CallerRunsPolicy +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].keepAliveTime=50 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].allowCoreThreadTimeOut=false +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].threadNamePrefix=test2 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[0].type=capacity +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[0].enabled=false +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[0].threshold=80 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[0].platforms[0]=ding +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[0].platforms[1]=wechat +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[0].interval=120 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[1].type=change +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[1].enabled=false +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[2].type=liveness +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[2].enabled=false +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[2].threshold=80 +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[3].type=reject +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[3].enabled=false +/configserver/dev/dynamic-tp-zookeeper-demo=dynamictp.executors[1].notifyItems[3].threshold=1 diff --git a/example/example-zookeeper/src/main/resources/dynamic-tp-zookeeper-demo.properties b/example/example-zookeeper/src/main/resources/dynamic-tp-zookeeper-demo.properties index fdf9854c521a8ccdcdb3d89b24c74aa48a38329f..3ddc80f327f5557442803964c97dda1ff81147e3 100644 --- a/example/example-zookeeper/src/main/resources/dynamic-tp-zookeeper-demo.properties +++ b/example/example-zookeeper/src/main/resources/dynamic-tp-zookeeper-demo.properties @@ -1,51 +1,51 @@ -spring.dynamic.tp.enabled=true -spring.dynamic.tp.enabledBanner=true -spring.dynamic.tp.enabledCollect=true -spring.dynamic.tp.collectorType=logging -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 +dynamictp.enabled=true +dynamictp.enabledBanner=true +dynamictp.enabledCollect=true +dynamictp.collectorType=logging +dynamictp.monitorInterval=5 +dynamictp.executors[0].threadPoolName=dynamic-tp-test-1 +dynamictp.executors[0].corePoolSize=50 +dynamictp.executors[0].maximumPoolSize=50 +dynamictp.executors[0].queueCapacity=3000 +dynamictp.executors[0].queueType=VariableLinkedBlockingQueue +dynamictp.executors[0].rejectedHandlerType=CallerRunsPolicy +dynamictp.executors[0].keepAliveTime=50 +dynamictp.executors[0].allowCoreThreadTimeOut=false +dynamictp.executors[0].threadNamePrefix=test1 +dynamictp.executors[0].notifyItems[0].type=capacity +dynamictp.executors[0].notifyItems[0].enabled=false +dynamictp.executors[0].notifyItems[0].threshold=80 +dynamictp.executors[0].notifyItems[0].platforms[0]=ding +dynamictp.executors[0].notifyItems[0].platforms[1]=wechat +dynamictp.executors[0].notifyItems[0].interval=120 +dynamictp.executors[0].notifyItems[1].type=change +dynamictp.executors[0].notifyItems[1].enabled=false +dynamictp.executors[0].notifyItems[2].type=liveness +dynamictp.executors[0].notifyItems[2].enabled=false +dynamictp.executors[0].notifyItems[2].threshold=80 +dynamictp.executors[0].notifyItems[3].type=reject +dynamictp.executors[0].notifyItems[3].enabled=false +dynamictp.executors[0].notifyItems[3].threshold=1 +dynamictp.executors[1].threadPoolName=dynamic-tp-test-2 +dynamictp.executors[1].corePoolSize=20 +dynamictp.executors[1].maximumPoolSize=30 +dynamictp.executors[1].queueCapacity=1000 +dynamictp.executors[1].queueType=VariableLinkedBlockingQueue +dynamictp.executors[1].rejectedHandlerType=CallerRunsPolicy +dynamictp.executors[1].keepAliveTime=50 +dynamictp.executors[1].allowCoreThreadTimeOut=false +dynamictp.executors[1].threadNamePrefix=test2 +dynamictp.executors[1].notifyItems[0].type=capacity +dynamictp.executors[1].notifyItems[0].enabled=false +dynamictp.executors[1].notifyItems[0].threshold=80 +dynamictp.executors[1].notifyItems[0].platforms[0]=ding +dynamictp.executors[1].notifyItems[0].platforms[1]=wechat +dynamictp.executors[1].notifyItems[0].interval=120 +dynamictp.executors[1].notifyItems[1].type=change +dynamictp.executors[1].notifyItems[1].enabled=false +dynamictp.executors[1].notifyItems[2].type=liveness +dynamictp.executors[1].notifyItems[2].enabled=false +dynamictp.executors[1].notifyItems[2].threshold=80 +dynamictp.executors[1].notifyItems[3].type=reject +dynamictp.executors[1].notifyItems[3].enabled=false +dynamictp.executors[1].notifyItems[3].threshold=1 diff --git a/example/.metric/dynamictp-k8s-grafana.json b/example/metric/dynamictp-grafana-k8s-v1.json similarity index 91% rename from example/.metric/dynamictp-k8s-grafana.json rename to example/metric/dynamictp-grafana-k8s-v1.json index 6b2a08c1f7081e17ffa3a37b0e6d228b5ce87e07..73fd558893fdbb3fe792beb1749eba620b46af06 100644 --- a/example/.metric/dynamictp-k8s-grafana.json +++ b/example/metric/dynamictp-grafana-k8s-v1.json @@ -65,8 +65,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -119,8 +118,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -174,8 +172,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -228,8 +225,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -301,8 +297,8 @@ "id": 27, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -327,8 +323,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -398,8 +393,8 @@ "id": 8, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -424,8 +419,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -495,8 +489,8 @@ "id": 6, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -521,8 +515,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_queue_size{app_name=\"$application\", thread_pool_name=\"$threadpool\"}", @@ -591,8 +584,8 @@ "id": 2, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -618,8 +611,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_queue_remaining_capacity{app_name=\"$application\", thread_pool_name=\"$threadpool\"}", @@ -690,8 +682,8 @@ "id": 30, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -713,8 +705,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_completed_task_count{app_name=\"$application\", thread_pool_name=\"$threadpool\"}", @@ -785,8 +776,8 @@ "id": 4, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -808,8 +799,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_reject_count{app_name=\"$application\", thread_pool_name=\"$threadpool\"}", @@ -879,8 +869,8 @@ "id": 14, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -905,8 +895,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_run_timeout_count{app_name=\"$application\", thread_pool_name=\"$threadpool\"}", @@ -974,8 +963,8 @@ "id": 18, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1000,8 +989,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_queue_timeout_count{app_name=\"$application\", thread_pool_name=\"$threadpool\"}", @@ -1069,8 +1057,8 @@ "id": 31, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1095,8 +1083,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1166,8 +1153,8 @@ "id": 16, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1192,8 +1179,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1263,8 +1249,8 @@ "id": 19, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1289,8 +1275,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1360,8 +1345,8 @@ "id": 20, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1386,8 +1371,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1457,8 +1441,8 @@ "id": 21, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1483,8 +1467,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1554,8 +1537,8 @@ "id": 22, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1580,8 +1563,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1651,8 +1633,8 @@ "id": 23, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1677,8 +1659,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1748,8 +1729,8 @@ "id": 24, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1774,8 +1755,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1799,9 +1779,7 @@ { "allValue": null, "current": { - "selected": false, - "text": "common-service", - "value": "common-service" + "selected": false }, "datasource": null, "definition": "label_values(thread_pool_current_size, kubernetes_namespace)", @@ -1830,9 +1808,7 @@ { "allValue": null, "current": { - "selected": false, - "text": "user-center", - "value": "user-center", + "selected": false }, "datasource": null, "definition": "label_values(thread_pool_current_size{kubernetes_namespace=\"$namespace\"}, app_name)", @@ -1861,9 +1837,7 @@ { "allValue": null, "current": { - "selected": false, - "text": "undertowTp", - "value": "undertowTp" + "selected": false }, "datasource": null, "definition": "label_values(thread_pool_current_size{app_name=\"$application\"}, thread_pool_name)", @@ -1898,6 +1872,5 @@ "timepicker": {}, "timezone": "", "title": "线程池监控(DynamicTp)", - "uid": "b48d82b2-96b0-45ea-801e-1d0a030459dc", "version": 29 } \ No newline at end of file diff --git a/example/.metric/k8s-version2-grafana.json b/example/metric/dynamictp-grafana-k8s-v2.json similarity index 91% rename from example/.metric/k8s-version2-grafana.json rename to example/metric/dynamictp-grafana-k8s-v2.json index 6fca6049eb08fe56ba3b0a107c08879ace5c871b..c3f493831e31607c2fb216ff86d7b10a5d21218e 100644 --- a/example/.metric/k8s-version2-grafana.json +++ b/example/metric/dynamictp-grafana-k8s-v2.json @@ -85,8 +85,8 @@ "id": 12, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -105,8 +105,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "keBBh9Lnk" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_current_size{cluster=\"$cluster\",namespace=\"$namespace\",container=\"$container\",pod=\"$pod\",thread_pool_name=~\"$threadpool\"}", @@ -175,8 +174,8 @@ "id": 8, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -195,8 +194,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "keBBh9Lnk" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_active_count{cluster=\"$cluster\",namespace=\"$namespace\",container=\"$container\",pod=\"$pod\",thread_pool_name=~\"$threadpool\"}", @@ -264,8 +262,8 @@ "id": 6, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -284,8 +282,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "keBBh9Lnk" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_queue_size{cluster=\"$cluster\",namespace=\"$namespace\",container=\"$container\",pod=\"$pod\",thread_pool_name=~\"$threadpool\"}\n", @@ -354,8 +351,8 @@ "id": 2, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -375,8 +372,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "keBBh9Lnk" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_queue_remaining_capacity{cluster=\"$cluster\",namespace=\"$namespace\",container=\"$container\",pod=\"$pod\",thread_pool_name=~\"$threadpool\"}", @@ -446,8 +442,8 @@ "id": 10, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -466,8 +462,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "keBBh9Lnk" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_completed_task_count{cluster=\"$cluster\",namespace=\"$namespace\",container=\"$container\",pod=\"$pod\",thread_pool_name=~\"$threadpool\"}", @@ -536,8 +531,8 @@ "id": 4, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -557,8 +552,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "keBBh9Lnk" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_reject_count{cluster=\"$cluster\",namespace=\"$namespace\",container=\"$container\",pod=\"$pod\",thread_pool_name=~\"$threadpool\"}\n", @@ -628,8 +622,8 @@ "id": 14, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -648,8 +642,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "keBBh9Lnk" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_run_timeout_count{cluster=\"$cluster\",namespace=\"$namespace\",container=\"$container\",pod=\"$pod\",thread_pool_name=~\"$threadpool\"}", @@ -717,8 +710,8 @@ "id": 16, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -737,8 +730,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "keBBh9Lnk" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_queue_timeout_count{cluster=\"$cluster\",namespace=\"$namespace\",container=\"$container\",pod=\"$pod\",thread_pool_name=~\"$threadpool\"}", @@ -759,13 +751,10 @@ "list": [ { "current":{ - "selected":true, - "text":"k8s-hw-bj-1-prod", - "value":"k8s-hw-bj-1-prod" + "selected":true }, "datasource":{ - "type":"prometheus", - "uid":"000000045" + "type":"prometheus" }, "definition":"label_values(cluster)", "hide":0, @@ -788,13 +777,10 @@ }, { "current":{ - "selected":false, - "text":"default", - "value":"default" + "selected":false }, "datasource":{ - "type":"prometheus", - "uid":"000000045" + "type":"prometheus" }, "definition":"label_values(kube_namespace_created{job=\"kube-state-metrics\", cluster=\"$cluster\"}, namespace)", "hide":0, @@ -817,13 +803,10 @@ }, { "current":{ - "selected":false, - "text":"room", - "value":"room" + "selected":false }, "datasource":{ - "type":"prometheus", - "uid":"000000045" + "type":"prometheus" }, "definition":"label_values(kube_pod_container_info{cluster=~\"$cluster\",namespace=~\"$namespace\"},container)", "hide":0, @@ -846,13 +829,10 @@ }, { "current":{ - "selected":false, - "text":"t-bean-portal-5db9b7548-bznwx", - "value":"t-bean-portal-5db9b7548-bznwx" + "selected":false }, "datasource":{ - "type":"prometheus", - "uid":"000000045" + "type":"prometheus" }, "definition":"label_values(kube_pod_container_info{cluster=~\"$cluster\",namespace=~\"$namespace\",container=~\"$container\"},pod)", "hide":0, @@ -917,6 +897,5 @@ "timepicker": {}, "timezone": "", "title": "线程池监控(DynamicTp)", - "uid": "5wBx-ysnk", "version": 8 } \ No newline at end of file diff --git a/example/.metric/dynamictp-grafana-2.json b/example/metric/dynamictp-grafana-with-instance.json similarity index 88% rename from example/.metric/dynamictp-grafana-2.json rename to example/metric/dynamictp-grafana-with-instance.json index 1ffb402663edea7049aba78dcfd4d7443d8398f9..741998223e6bad90b81e443f1218a6e91af6c1f8 100644 --- a/example/.metric/dynamictp-grafana-2.json +++ b/example/metric/dynamictp-grafana-with-instance.json @@ -30,8 +30,7 @@ "panels": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "核心线程数", "fieldConfig": { @@ -82,8 +81,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "expr": "thread_pool_core_size{app_name=\"$application\", instance=\"$instance\", thread_pool_name=\"$threadpool\"}", @@ -97,8 +95,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "最大线程数", "fieldConfig": { @@ -146,8 +143,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "expr": "thread_pool_maximum_size{app_name=\"$application\", instance=\"$instance\", thread_pool_name=\"$threadpool\"}", @@ -161,8 +157,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tps", "fieldConfig": { @@ -210,8 +205,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "expr": "thread_pool_tps{app_name=\"$application\", instance=\"$instance\", thread_pool_name=\"$threadpool\"}", @@ -225,8 +219,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tp99 耗时", "fieldConfig": { @@ -274,8 +267,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "expr": "thread_pool_completed_task_time_tp99{app_name=\"$application\", instance=\"$instance\", thread_pool_name=\"$threadpool\"}", @@ -289,8 +281,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "当前线程数", "fieldConfig": { @@ -354,8 +345,8 @@ "id": 27, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -377,8 +368,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -394,8 +384,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "活跃线程数", "fieldConfig": { @@ -459,8 +448,8 @@ "id": 8, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -482,8 +471,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -499,8 +487,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "任务队列大小", "fieldConfig": { @@ -564,8 +551,8 @@ "id": 6, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -587,8 +574,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_queue_size{app_name=\"$application\", instance=\"$instance\", thread_pool_name=\"$threadpool\"}\n", @@ -602,8 +588,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "任务队列剩余大小", "fieldConfig": { @@ -668,8 +653,8 @@ "id": 2, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -692,8 +677,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_queue_remaining_capacity{app_name=\"$application\", instance=\"$instance\", thread_pool_name=\"$threadpool\"}", @@ -709,8 +693,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "完成任务数", "fieldConfig": { @@ -774,8 +757,8 @@ "id": 10, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -797,8 +780,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_completed_task_count{app_name=\"$application\", instance=\"$instance\", thread_pool_name=\"$threadpool\"}", @@ -812,8 +794,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "拒绝任务数", "fieldConfig": { @@ -878,8 +859,8 @@ "id": 4, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -902,8 +883,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_reject_count{app_name=\"$application\", instance=\"$instance\", thread_pool_name=\"$threadpool\"}\n", @@ -919,8 +899,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "执行超时任务数", "fieldConfig": { @@ -984,8 +963,8 @@ "id": 14, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1007,8 +986,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "exemplar": true, "expr": "thread_pool_run_timeout_count{app_name=\"$application\", instance=\"$instance\", thread_pool_name=\"$threadpool\"}", @@ -1022,8 +1000,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "排队超时任务数", "fieldConfig": { @@ -1087,8 +1064,8 @@ "id": 18, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1110,8 +1087,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1127,8 +1103,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tps", "fieldConfig": { @@ -1192,8 +1167,8 @@ "id": 17, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1215,8 +1190,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1232,8 +1206,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tp999 耗时", "fieldConfig": { @@ -1297,8 +1270,8 @@ "id": 16, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1320,8 +1293,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1337,8 +1309,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tp99 耗时", "fieldConfig": { @@ -1402,8 +1373,8 @@ "id": 19, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1425,8 +1396,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1442,8 +1412,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tp95 耗时", "fieldConfig": { @@ -1507,8 +1476,8 @@ "id": 20, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1530,8 +1499,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1547,8 +1515,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tp90 耗时", "fieldConfig": { @@ -1612,8 +1579,8 @@ "id": 21, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1635,8 +1602,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1652,8 +1618,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tp50 耗时", "fieldConfig": { @@ -1717,8 +1682,8 @@ "id": 22, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1740,8 +1705,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1757,8 +1721,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "任务平均耗时", "fieldConfig": { @@ -1822,8 +1785,8 @@ "id": 23, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1845,8 +1808,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1862,8 +1824,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "任务最大耗时", "fieldConfig": { @@ -1927,8 +1888,8 @@ "id": 24, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1950,8 +1911,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1974,13 +1934,10 @@ "list": [ { "current": { - "selected": false, - "text": "dynamic-tp-demo", - "value": "dynamic-tp-demo" + "selected": false }, "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "definition": "label_values(app_name)", "hide": 0, @@ -2001,13 +1958,10 @@ }, { "current": { - "selected": false, - "text": "192.168.1.2:9018", - "value": "192.168.1.2:9018" + "selected": false }, "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "definition": "label_values({app_name=\"$application\"}, instance)", "hide": 0, @@ -2028,13 +1982,10 @@ }, { "current": { - "selected": false, - "text": "dtpExecutor1", - "value": "dtpExecutor1" + "selected": false }, "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "definition": "label_values({app_name=\"$application\"}, thread_pool_name)", "hide": 0, @@ -2062,7 +2013,6 @@ "timepicker": {}, "timezone": "", "title": "线程池监控(DynamicTp)", - "uid": "b48d82b2-96b0-45ea-801e-1d0a030459dc", "version": 5, "weekStart": "" } \ No newline at end of file diff --git a/example/.metric/dynamictp-grafana-1.json b/example/metric/dynamictp-grafana-without-instance.json similarity index 88% rename from example/.metric/dynamictp-grafana-1.json rename to example/metric/dynamictp-grafana-without-instance.json index 7720e6e240cd3f38813a3a765ca860a49f88b992..2ee1cb77962d4e801526bfffb297d9bf60afa0ee 100644 --- a/example/.metric/dynamictp-grafana-1.json +++ b/example/metric/dynamictp-grafana-without-instance.json @@ -30,8 +30,7 @@ "panels": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "核心线程数", "fieldConfig": { @@ -84,8 +83,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "expr": "thread_pool_core_size{app_name=\"$application\", thread_pool_name=\"$threadpool\"}", @@ -100,8 +98,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "最大线程数", "fieldConfig": { @@ -153,8 +150,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "expr": "thread_pool_maximum_size{app_name=\"$application\", thread_pool_name=\"$threadpool\"}", @@ -169,8 +165,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tps", "fieldConfig": { @@ -222,8 +217,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "expr": "thread_pool_tps{app_name=\"$application\", thread_pool_name=\"$threadpool\"}", @@ -238,8 +232,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tp99 耗时", "fieldConfig": { @@ -292,8 +285,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "expr": "thread_pool_completed_task_time_tp99{app_name=\"$application\", thread_pool_name=\"$threadpool\"}", @@ -308,8 +300,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "当前线程数", "fieldConfig": { @@ -373,8 +364,8 @@ "id": 27, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -396,8 +387,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -413,8 +403,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "活跃线程数", "fieldConfig": { @@ -478,8 +467,8 @@ "id": 8, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -501,8 +490,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -518,8 +506,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "任务队列大小", "fieldConfig": { @@ -583,8 +570,8 @@ "id": 6, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -606,8 +593,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -623,8 +609,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "任务队列剩余大小", "fieldConfig": { @@ -689,8 +674,8 @@ "id": 2, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -713,8 +698,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -732,8 +716,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "完成任务数", "fieldConfig": { @@ -797,8 +780,8 @@ "id": 10, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -820,8 +803,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -837,8 +819,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "拒绝任务数", "fieldConfig": { @@ -903,8 +884,8 @@ "id": 4, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -927,8 +908,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -946,8 +926,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "执行超时任务数", "fieldConfig": { @@ -1010,8 +989,8 @@ "id": 14, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1033,8 +1012,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1050,8 +1028,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "排队超时任务数", "fieldConfig": { @@ -1114,8 +1091,8 @@ "id": 18, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1137,8 +1114,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1154,8 +1130,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tps", "fieldConfig": { @@ -1218,8 +1193,8 @@ "id": 17, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1241,8 +1216,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1258,8 +1232,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tp999 耗时", "fieldConfig": { @@ -1322,8 +1295,8 @@ "id": 16, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1345,8 +1318,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1362,8 +1334,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tp99 耗时", "fieldConfig": { @@ -1426,8 +1397,8 @@ "id": 19, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1449,8 +1420,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1466,8 +1436,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tp95 耗时", "fieldConfig": { @@ -1530,8 +1499,8 @@ "id": 20, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1553,8 +1522,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1570,8 +1538,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tp90 耗时", "fieldConfig": { @@ -1634,8 +1601,8 @@ "id": 21, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1657,8 +1624,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1674,8 +1640,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "tp50 耗时", "fieldConfig": { @@ -1738,8 +1703,8 @@ "id": 22, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1761,8 +1726,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1778,8 +1742,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "任务平均耗时", "fieldConfig": { @@ -1842,8 +1805,8 @@ "id": 23, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1865,8 +1828,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1882,8 +1844,7 @@ }, { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "description": "任务最大耗时", "fieldConfig": { @@ -1946,8 +1907,8 @@ "id": 24, "links": [ { - "title": "https://github.com/lyh200/dynamic-tp", - "url": "https://github.com/lyh200/dynamic-tp" + "title": "https://github.com/dromara/dynamic-tp", + "url": "https://github.com/dromara/dynamic-tp" } ], "options": { @@ -1969,8 +1930,7 @@ "targets": [ { "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "editorMode": "code", "exemplar": true, @@ -1993,13 +1953,10 @@ "list": [ { "current": { - "selected": false, - "text": "dynamic-tp-cloud-consul-demo", - "value": "dynamic-tp-cloud-consul-demo" + "selected": false }, "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "definition": "label_values(app_name)", "hide": 0, @@ -2020,13 +1977,10 @@ }, { "current": { - "selected": false, - "text": "undertowTp", - "value": "undertowTp" + "selected": false }, "datasource": { - "type": "prometheus", - "uid": "a4ef36c9-2114-42d2-b71a-7d0350bf3d4c" + "type": "prometheus" }, "definition": "label_values({app_name=\"$application\"}, thread_pool_name)", "hide": 0, @@ -2054,7 +2008,6 @@ "timepicker": {}, "timezone": "", "title": "线程池监控(DynamicTp)", - "uid": "5wBx-ysnk", "version": 32, "weekStart": "" } \ No newline at end of file diff --git a/example/.metric/prometheus-k8s-sd.yml b/example/metric/prometheus-k8s-sd.yml similarity index 100% rename from example/.metric/prometheus-k8s-sd.yml rename to example/metric/prometheus-k8s-sd.yml diff --git a/example/metric/prometheus-test.yml b/example/metric/prometheus-test.yml new file mode 100644 index 0000000000000000000000000000000000000000..c2ca3e71b0f28c7463b4cce976508af91cf43d17 --- /dev/null +++ b/example/metric/prometheus-test.yml @@ -0,0 +1,50 @@ +# my global config +global: + scrape_interval: 5s # Set the scrape interval to every 15 seconds. Default is every 1 minute. + evaluation_interval: 55s # Evaluate rules every 15 seconds. The default is every 1 minute. + # scrape_timeout is set to the global default (10s). + +# Alertmanager configuration +alerting: + alertmanagers: + - static_configs: + - targets: + # - alertmanager:9093 + +# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. +rule_files: +# - "first_rules.yml" +# - "second_rules.yml" + +# A scrape configuration containing exactly one endpoint to scrape: +# Here it's Prometheus itself. +scrape_configs: + # The job name is added as a label `job=` to any timeseries scraped from this config. + # metrics_path defaults to '/metrics' + # scheme defaults to 'http'. + - job_name: prometheus + static_configs: + - targets: [ 'localhost:9090' ] + labels: + instance: prometheus + + - job_name: linux + static_configs: + - targets: [ '192.168.31.44:9100' ] + labels: + instance: linux + + - job_name: 'dynamictp-polaris' + metrics_path: '/actuator/prometheus' + static_configs: + - targets: [ '192.168.1.5:9018' ] + + - job_name: 'dynamictp-nacos' + metrics_path: '/actuator/prometheus' + static_configs: + - targets: [ '192.168.1.5:9100' ] + + - job_name: 'dynamictp-apollo' + metrics_path: '/actuator/prometheus' + static_configs: + - targets: [ '192.168.1.5:8888' ] diff --git a/example/pom.xml b/example/pom.xml index 75ea8f54b3fa895e64288156b2fdc95c73614777..07b9f31c1a1fbc838712e035a751e85e5cfe6f15 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-all - ${revision} + 1.2.1 ../pom.xml dynamic-tp-example diff --git a/extension/extension-agent/pom.xml b/extension/extension-agent/pom.xml index 26585b894da4d0f1a6e63bb6a00760ece736aafd..27af96eab869d9b9e867eb3fa568868c49a2cd4d 100644 --- a/extension/extension-agent/pom.xml +++ b/extension/extension-agent/pom.xml @@ -4,11 +4,9 @@ org.dromara.dynamictp dynamic-tp-extension - ${revision} + 1.2.1 ../pom.xml dynamic-tp-extension-agent - - diff --git a/extension/extension-agent/src/main/java/org/dromara/dynamictp/core/aware/AgentAware.java b/extension/extension-agent/src/main/java/org/dromara/dynamictp/extension/agent/AgentAware.java similarity index 81% rename from extension/extension-agent/src/main/java/org/dromara/dynamictp/core/aware/AgentAware.java rename to extension/extension-agent/src/main/java/org/dromara/dynamictp/extension/agent/AgentAware.java index f456db8168b8529d8c9a7fa1f174bcd74e348799..87a236de03680903cb47f318bf6bd9d792981350 100644 --- a/extension/extension-agent/src/main/java/org/dromara/dynamictp/core/aware/AgentAware.java +++ b/extension/extension-agent/src/main/java/org/dromara/dynamictp/extension/agent/AgentAware.java @@ -15,19 +15,23 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.aware; +package org.dromara.dynamictp.extension.agent; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.dromara.dynamictp.core.aware.TaskStatAware; import org.dromara.dynamictp.core.support.task.runnable.DtpRunnable; import java.lang.ref.SoftReference; import java.lang.reflect.Field; import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.stream.Collectors; @@ -58,7 +62,7 @@ public class AgentAware extends TaskStatAware { return "agent"; } - private DtpRunnable determineDtpRunnable(List conditionalFields, Runnable r) throws IllegalAccessException { + private DtpRunnable determineDtpRunnable(List conditionalFields, Runnable r, Set visitedClass) throws IllegalAccessException { for (Field field : conditionalFields) { if (Objects.isNull(field)) { continue; @@ -68,8 +72,13 @@ public class AgentAware extends TaskStatAware { if (o instanceof DtpRunnable) { return (DtpRunnable) o; } + if (Objects.isNull(o) || CollUtil.contains(visitedClass, o.getClass())) { + return null; + } else { + visitedClass.add(o.getClass()); + } // 纵向查找 - DtpRunnable dtpRunnable = getDtpRunnable(o.getClass(), o); + DtpRunnable dtpRunnable = getDtpRunnable(o.getClass(), o, visitedClass); if (dtpRunnable != null) { return dtpRunnable; } @@ -77,7 +86,7 @@ public class AgentAware extends TaskStatAware { return null; } - private DtpRunnable getDtpRunnable(Class rClass, Runnable r) throws IllegalAccessException { + private DtpRunnable getDtpRunnable(Class rClass, Runnable r, Set visitedClass) throws IllegalAccessException { while (Runnable.class.isAssignableFrom(rClass)) { Field[] declaredFields = rClass.getDeclaredFields(); if (ArrayUtil.isNotEmpty(declaredFields)) { @@ -85,7 +94,7 @@ public class AgentAware extends TaskStatAware { .filter(ele -> Runnable.class.isAssignableFrom(ele.getType())) .collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(conditionFields)) { - DtpRunnable dtpRunnable = determineDtpRunnable(conditionFields, r); + DtpRunnable dtpRunnable = determineDtpRunnable(conditionFields, r, visitedClass); if (Objects.nonNull(dtpRunnable)) { return dtpRunnable; } @@ -106,13 +115,13 @@ public class AgentAware extends TaskStatAware { DtpRunnable dtpRunnable = null; Class rClass = r.getClass(); try { - dtpRunnable = getDtpRunnable(rClass, r); + dtpRunnable = getDtpRunnable(rClass, r, new HashSet<>()); } catch (IllegalAccessException e) { log.error("getDtpRunnable Error", e); } if (dtpRunnable == null) { - if (log.isWarnEnabled()) { - log.warn("DynamicTp aware [{}], can not find DtpRunnable.", getName()); + if (log.isDebugEnabled()) { + log.debug("DynamicTp aware [{}], can not find DtpRunnable.", getName()); } return r; } @@ -127,6 +136,13 @@ public class AgentAware extends TaskStatAware { } else { // 被封装的wrapper没有找到DtpRunnable对象,那么就关闭某些监控指标,防止内存溢出 System.setProperty(DTP_EXECUTE_ENHANCED, FALSE_STR); + if (log.isDebugEnabled()) { + if (runnableWrap == null) { + log.warn("DynamicTp aware, can not find Runnable."); + } else { + log.warn("DynamicTp aware, can not find DtpRunnable, runnable: {}", runnableWrap.getClass().getName()); + } + } } return runnableWrap; } diff --git a/extension/extension-agent/src/main/resources/META-INF/services/org.dromara.dynamictp.core.aware.ExecutorAware b/extension/extension-agent/src/main/resources/META-INF/services/org.dromara.dynamictp.core.aware.ExecutorAware index 064e5f138ce1b73250c62f6f64e5ec3d4c79a364..9334503f74231dd2ba24f729f94ce027c3af5db0 100644 --- a/extension/extension-agent/src/main/resources/META-INF/services/org.dromara.dynamictp.core.aware.ExecutorAware +++ b/extension/extension-agent/src/main/resources/META-INF/services/org.dromara.dynamictp.core.aware.ExecutorAware @@ -1 +1 @@ -org.dromara.dynamictp.core.aware.AgentAware \ No newline at end of file +org.dromara.dynamictp.extension.agent.AgentAware \ No newline at end of file diff --git a/extension/extension-limiter-redis/pom.xml b/extension/extension-limiter-redis/pom.xml index e721514adddf90dcd0ae2665bbda567dbc26d357..f89e42adefcea039ebdf569c128e84c479d8ca93 100644 --- a/extension/extension-limiter-redis/pom.xml +++ b/extension/extension-limiter-redis/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-extension - ${revision} + 1.2.1 ../pom.xml dynamic-tp-extension-limiter-redis diff --git a/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/AbstractRedisRateLimiter.java b/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/AbstractRedisRateLimiter.java index b547467a9f008e16e8497ba96ce38e07481e30ed..ca94d177ab3130223bce75dbaa433734e48a6b17 100644 --- a/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/AbstractRedisRateLimiter.java +++ b/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/AbstractRedisRateLimiter.java @@ -23,7 +23,6 @@ import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.data.redis.core.script.RedisScript; import org.springframework.scripting.support.ResourceScriptSource; -import java.time.Instant; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -61,22 +60,12 @@ public abstract class AbstractRedisRateLimiter implements RedisRateLimiter getKeys(final String key) { - String cacheKey = PREFIX + ":" + key; - return Collections.singletonList(cacheKey); - } - - @Override - public List isAllowed(String key, long windowSize, int limit) { + public List isAllowed(String key, long windowSize, int limit) { RedisScript script = this.getScript(); List keys = this.getKeys(key); - + String[] values = this.getArgs(key, windowSize, limit); return Collections.unmodifiableList((List) Objects.requireNonNull(stringRedisTemplate.execute(script, keys, - doubleToString(windowSize), doubleToString(limit), doubleToString(Instant.now().getEpochSecond())))); + values))); } - private String doubleToString(final double param) { - return String.valueOf(param); - } } diff --git a/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/RedisRateLimiter.java b/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/RedisRateLimiter.java index 579e0452b6c8d8fd811fa939399e0b9d2c655e61..4da6cc09a166fcf90d0f1de45653049aeebe5660 100644 --- a/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/RedisRateLimiter.java +++ b/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/RedisRateLimiter.java @@ -46,12 +46,23 @@ public interface RedisRateLimiter { List getKeys(String key); /** - * If allowed. + * Get args. * * @param key the key * @param windowSize the window size * @param limit the limit + * @return the args + */ + String[] getArgs(String key, long windowSize, int limit); + + /** + * Acquires permission of an invocation only if it is available at the time of invoking. + * + * @param name the key + * @param interval the interval + * @param limit the limit * @return the result */ - T isAllowed(String key, long windowSize, int limit); + boolean tryPass(String name, long interval, int limit); + } diff --git a/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/NotifyRedisRateLimiterFilter.java b/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/RedisRateLimiterNotifyFilter.java similarity index 57% rename from extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/NotifyRedisRateLimiterFilter.java rename to extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/RedisRateLimiterNotifyFilter.java index d423c8ef955250788c17eb34c66bcadda0ceb695..7da7a81d59c3685a8ef325a65b4c5fa9f0a40c24 100644 --- a/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/NotifyRedisRateLimiterFilter.java +++ b/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/RedisRateLimiterNotifyFilter.java @@ -18,8 +18,7 @@ package org.dromara.dynamictp.extension.limiter.redis.ratelimiter; import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.apache.commons.collections4.CollectionUtils; +import org.dromara.dynamictp.common.entity.NotifyItem; import org.dromara.dynamictp.common.pattern.filter.Invoker; import org.dromara.dynamictp.core.notifier.chain.filter.NotifyFilter; import org.dromara.dynamictp.core.notifier.context.BaseNotifyCtx; @@ -28,15 +27,13 @@ import javax.annotation.Resource; import java.util.List; /** - * NotifyRedisRateLimiterFilter related + * RedisRateLimiterNotifyFilter related * * @author yanhom * @since 1.0.8 **/ @Slf4j -public class NotifyRedisRateLimiterFilter implements NotifyFilter { - - public static final int LUA_RES_REMAIN_INDEX = 2; +public class RedisRateLimiterNotifyFilter implements NotifyFilter { @Resource private RedisRateLimiter> redisScriptRateLimiter; @@ -47,29 +44,21 @@ public class NotifyRedisRateLimiterFilter implements NotifyFilter { } @Override - public void doFilter(BaseNotifyCtx context, Invoker nextFilter) { - String notifyName = context.getExecutorWrapper().getThreadPoolName() + ":" + context.getNotifyItemEnum().getValue(); - boolean checkResult = check(notifyName, context.getNotifyItem().getClusterLimit(), - context.getNotifyItem().getInterval()); - if (checkResult) { - nextFilter.invoke(context); + public void doFilter(BaseNotifyCtx context, Invoker nextInvoker) { + if (tryPass(context)) { + nextInvoker.invoke(context); } } - private boolean check(String notifyName, int limit, long interval) { - try { - val res = redisScriptRateLimiter.isAllowed(notifyName, interval, limit); - if (CollectionUtils.isEmpty(res)) { - return true; - } - if (res.get(LUA_RES_REMAIN_INDEX) <= 0) { - log.debug("DynamicTp notify, trigger redis rate limit, limitKey:{}", res.get(0)); - return false; - } - return true; - } catch (Exception e) { - log.error("DynamicTp notify, redis rate limit check failed, limitKey:{}", notifyName, e); + private boolean tryPass(BaseNotifyCtx context) { + // silence period <= 0 indicates that no rate limit check is required. + NotifyItem notifyItem = context.getNotifyItem(); + if (notifyItem.getSilencePeriod() <= 0) { return true; } + String notifyName = context.getExecutorWrapper().getThreadPoolName() + "#" + context.getNotifyItemType().getType(); + int silencePeriod = notifyItem.getSilencePeriod(); + int clusterLimit = notifyItem.getClusterLimit(); + return redisScriptRateLimiter.tryPass(notifyName, silencePeriod, clusterLimit); } } diff --git a/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/SlidingWindowRateLimiter.java b/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/SlidingWindowRateLimiter.java index 9bd5afdc2e666e5301aa492aba566ea87c5584c3..0e0d6c06b530d4f3e7e26e98f0cc8c7b30d2f0ff 100644 --- a/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/SlidingWindowRateLimiter.java +++ b/extension/extension-limiter-redis/src/main/java/org/dromara/dynamictp/extension/limiter/redis/ratelimiter/SlidingWindowRateLimiter.java @@ -17,12 +17,17 @@ package org.dromara.dynamictp.extension.limiter.redis.ratelimiter; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.apache.commons.collections4.CollectionUtils; import org.dromara.dynamictp.common.util.CommonUtil; import org.dromara.dynamictp.extension.limiter.redis.em.RateLimitEnum; import org.springframework.data.redis.core.StringRedisTemplate; -import java.util.Arrays; +import java.time.Instant; +import java.util.Collections; import java.util.List; +import java.util.Objects; /** * SlidingWindowRateLimiter related @@ -30,8 +35,11 @@ import java.util.List; * @author yanhom * @since 1.0.8 **/ +@Slf4j public class SlidingWindowRateLimiter extends AbstractRedisRateLimiter { + public static final int LUA_RES_REMAIN_INDEX = 2; + public SlidingWindowRateLimiter(StringRedisTemplate stringRedisTemplate) { super(RateLimitEnum.SLIDING_WINDOW.getScriptName(), stringRedisTemplate); } @@ -39,7 +47,41 @@ public class SlidingWindowRateLimiter extends AbstractRedisRateLimiter { @Override public List getKeys(final String key) { String cacheKey = CommonUtil.getInstance().getServiceName() + ":" + PREFIX + ":" + key; + return Collections.singletonList(cacheKey); + } + + @Override + public String[] getArgs(String key, long windowSize, int limit) { String memberKey = CommonUtil.getInstance().getIp() + ":" + COUNTER.incrementAndGet(); - return Arrays.asList(cacheKey, memberKey); + return new String[]{ + doubleToString(windowSize), + doubleToString(limit), + doubleToString(Instant.now().getEpochSecond()), + memberKey + }; + } + + @Override + public boolean tryPass(String name, long interval, int limit) { + try { + val res = isAllowed(name, interval, limit); + if (CollectionUtils.isEmpty(res)) { + return true; + } + if (Objects.isNull(res.get(LUA_RES_REMAIN_INDEX)) || (long) res.get(LUA_RES_REMAIN_INDEX) <= 0) { + if (log.isDebugEnabled()) { + log.debug("DynamicTp notify, trigger redis rate limit, limitKey:{}, res:{}", name, res); + } + return false; + } + return true; + } catch (Exception e) { + log.error("DynamicTp notify, redis rate limit check failed, limitKey:{}", name, e); + return true; + } + } + + private String doubleToString(final double param) { + return String.valueOf(param); } } diff --git a/extension/extension-limiter-redis/src/main/resources/scripts/sliding_window_rate_limiter.lua b/extension/extension-limiter-redis/src/main/resources/scripts/sliding_window_rate_limiter.lua index 464735c64d0ecf1ea0350948358303261026e0c5..61ee0db56b88c5d34f273014c5c692cf0f407865 100644 --- a/extension/extension-limiter-redis/src/main/resources/scripts/sliding_window_rate_limiter.lua +++ b/extension/extension-limiter-redis/src/main/resources/scripts/sliding_window_rate_limiter.lua @@ -1,9 +1,9 @@ local key = KEYS[1] -local member = KEYS[2] local window_size = tonumber(ARGV[1]) local limit = tonumber(ARGV[2]) local timestamp = tonumber(ARGV[3]) +local member = ARGV[4] local accepted = 0 local exists_key = redis.call('exists', key) diff --git a/extension/extension-notify-email/pom.xml b/extension/extension-notify-email/pom.xml index 37becc700427db3f978c7a06df6d300cb129d13c..f46899a2917afde801ee9faac5617a7957c4f577 100644 --- a/extension/extension-notify-email/pom.xml +++ b/extension/extension-notify-email/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-extension - ${revision} + 1.2.1 ../pom.xml dynamic-tp-extension-notify-email diff --git a/extension/extension-notify-email/src/main/java/org/dromara/dynamictp/extension/notify/email/DtpEmailNotifier.java b/extension/extension-notify-email/src/main/java/org/dromara/dynamictp/extension/notify/email/DtpEmailNotifier.java index ebc6304f89738e1b9df16193b14a94f73a2411f2..8d079a2d18e63f2c343feb2788f1175c46bb1410 100644 --- a/extension/extension-notify-email/src/main/java/org/dromara/dynamictp/extension/notify/email/DtpEmailNotifier.java +++ b/extension/extension-notify-email/src/main/java/org/dromara/dynamictp/extension/notify/email/DtpEmailNotifier.java @@ -20,13 +20,12 @@ package org.dromara.dynamictp.extension.notify.email; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.apache.commons.lang3.tuple.Pair; -import org.dromara.dynamictp.common.em.NotifyItemEnum; import org.dromara.dynamictp.common.em.NotifyPlatformEnum; -import org.dromara.dynamictp.common.entity.AlarmInfo; import org.dromara.dynamictp.common.entity.NotifyItem; import org.dromara.dynamictp.common.entity.NotifyPlatform; import org.dromara.dynamictp.common.entity.TpMainFields; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; +import org.dromara.dynamictp.common.notifier.type.CommonNotifyItemType; import org.dromara.dynamictp.common.util.CommonUtil; import org.dromara.dynamictp.common.util.DateUtil; import org.dromara.dynamictp.core.notifier.AbstractDtpNotifier; @@ -39,6 +38,7 @@ import org.thymeleaf.context.Context; import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.concurrent.TimeUnit; import static org.dromara.dynamictp.common.constant.DynamicTpConst.UNKNOWN; @@ -54,7 +54,7 @@ import static org.dromara.dynamictp.core.notifier.manager.NotifyHelper.getAlarmK public class DtpEmailNotifier extends AbstractDtpNotifier { public DtpEmailNotifier() { - super(ApplicationContextHolder.getBean(EmailNotifier.class)); + super(ContextManagerHelper.getBean(EmailNotifier.class)); } @Override @@ -78,18 +78,18 @@ public class DtpEmailNotifier extends AbstractDtpNotifier { } @Override - protected String buildAlarmContent(NotifyPlatform platform, NotifyItemEnum notifyItemEnum) { + protected String buildAlarmContent(NotifyPlatform platform, CommonNotifyItemType notifyItemType) { AlarmCtx alarmCtx = (AlarmCtx) DtpNotifyCtxHolder.get(); + NotifyItem notifyItem = alarmCtx.getNotifyItem(); ExecutorWrapper executorWrapper = alarmCtx.getExecutorWrapper(); + String threadPoolName = executorWrapper.getThreadPoolName(); + String alarmValue = notifyItem.getCount() + " / " + alarmCtx.getAlarmInfo().getCount(); + String lastAlarmTime = AlarmCounter.getLastAlarmTime(threadPoolName, notifyItem); + val executor = executorWrapper.getExecutor(); - NotifyItem notifyItem = alarmCtx.getNotifyItem(); - AlarmInfo alarmInfo = alarmCtx.getAlarmInfo(); val statProvider = executorWrapper.getThreadPoolStatProvider(); - val alarmValue = notifyItem.getThreshold() + notifyItemEnum.getUnit() + " / " - + AlarmCounter.calcCurrentValue(executorWrapper, notifyItemEnum) + notifyItemEnum.getUnit(); - Context context = newContext(executorWrapper); - context.setVariable("alarmType", populateAlarmItem(notifyItemEnum, executorWrapper)); + context.setVariable("alarmType", populateAlarmItem(notifyItemType, notifyItem, executorWrapper)); context.setVariable("alarmValue", alarmValue); context.setVariable("corePoolSize", executor.getCorePoolSize()); context.setVariable("maximumPoolSize", executor.getMaximumPoolSize()); @@ -107,11 +107,12 @@ public class DtpEmailNotifier extends AbstractDtpNotifier { context.setVariable("rejectCount", statProvider.getRejectedTaskCount()); context.setVariable("runTimeoutCount", statProvider.getRunTimeoutCount()); context.setVariable("queueTimeoutCount", statProvider.getQueueTimeoutCount()); - context.setVariable("lastAlarmTime", alarmInfo.getLastAlarmTime() == null ? UNKNOWN : alarmInfo.getLastAlarmTime()); + context.setVariable("lastAlarmTime", Optional.ofNullable(lastAlarmTime).orElse(UNKNOWN)); context.setVariable("alarmTime", DateUtil.now()); + context.setVariable("alarmPeriod", notifyItem.getPeriod()); + context.setVariable("alarmSilencePeriod", notifyItem.getSilencePeriod()); + context.setVariable("highlightVariables", getAlarmKeys(notifyItemType)); context.setVariable("trace", getTraceInfo()); - context.setVariable("alarmInterval", notifyItem.getInterval()); - context.setVariable("highlightVariables", getAlarmKeys(notifyItemEnum)); context.setVariable("ext", getExtInfo()); return ((EmailNotifier) notifier).processTemplateContent("alarm", context); } diff --git a/extension/extension-notify-email/src/main/resources/templates/alarm.html b/extension/extension-notify-email/src/main/resources/templates/alarm.html index 9c76a2590dc55ef09f235e48310d9bfce56088dd..ffca7cd458ccaf44497dc4c60c918058c4c26a2d 100644 --- a/extension/extension-notify-email/src/main/resources/templates/alarm.html +++ b/extension/extension-notify-email/src/main/resources/templates/alarm.html @@ -343,10 +343,13 @@ 报警时间:

- trace 信息:

+ 统计周期: s

+

+ 静默时长: s

- 报警间隔: s

+ trace 信息:

扩展信息:

diff --git a/extension/extension-notify-yunzhijia/pom.xml b/extension/extension-notify-yunzhijia/pom.xml index 6c4efdef779b48e8ddc1b0dfad1dfe8e5a93b6d9..e212e0e884bdc0847f1437396469379845861059 100644 --- a/extension/extension-notify-yunzhijia/pom.xml +++ b/extension/extension-notify-yunzhijia/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-extension - ${revision} + 1.2.1 ../pom.xml diff --git a/extension/extension-notify-yunzhijia/src/main/java/org/dromara/dynamictp/extension/notify/yunzhijia/DtpYunZhiJiaNotifier.java b/extension/extension-notify-yunzhijia/src/main/java/org/dromara/dynamictp/extension/notify/yunzhijia/DtpYunZhiJiaNotifier.java index 525835d9944bebb242ef6fc25c75cef750216951..fa6ce1da20fbd48d8d6a330f376b81de2baf1b06 100644 --- a/extension/extension-notify-yunzhijia/src/main/java/org/dromara/dynamictp/extension/notify/yunzhijia/DtpYunZhiJiaNotifier.java +++ b/extension/extension-notify-yunzhijia/src/main/java/org/dromara/dynamictp/extension/notify/yunzhijia/DtpYunZhiJiaNotifier.java @@ -20,7 +20,7 @@ package org.dromara.dynamictp.extension.notify.yunzhijia; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; import org.dromara.dynamictp.core.notifier.AbstractDtpNotifier; /** @@ -33,7 +33,7 @@ import org.dromara.dynamictp.core.notifier.AbstractDtpNotifier; public class DtpYunZhiJiaNotifier extends AbstractDtpNotifier { public DtpYunZhiJiaNotifier() { - super(ApplicationContextHolder.getBean(YunZhiJiaNotifier.class)); + super(ContextManagerHelper.getBean(YunZhiJiaNotifier.class)); } @Override diff --git a/extension/extension-notify-yunzhijia/src/main/java/org/dromara/dynamictp/extension/notify/yunzhijia/YunZhiJiaNotifyConst.java b/extension/extension-notify-yunzhijia/src/main/java/org/dromara/dynamictp/extension/notify/yunzhijia/YunZhiJiaNotifyConst.java index c3d957fc7d343fb8b15f79392f3358383b29c6a5..280c1dbf3a99cadf23427e24687cba5c5ae1fe01 100644 --- a/extension/extension-notify-yunzhijia/src/main/java/org/dromara/dynamictp/extension/notify/yunzhijia/YunZhiJiaNotifyConst.java +++ b/extension/extension-notify-yunzhijia/src/main/java/org/dromara/dynamictp/extension/notify/yunzhijia/YunZhiJiaNotifyConst.java @@ -69,8 +69,9 @@ public final class YunZhiJiaNotifyConst { "上次报警时间:%s \n" + "报警时间:%s \n" + "接收人:@%s \n" + + "统计周期:%ss \n" + + "静默时长:%ss \n" + "trace 信息:%s \n" + - "报警间隔:%ss \n" + "扩展信息:%s \n"; public static final String CHANGE_NOTICE_TEMPLATE = diff --git a/extension/extension-opentelemetry/pom.xml b/extension/extension-opentelemetry/pom.xml index c3f1816914472186715bf623108f41f2661c8c67..4434404992ea4bc66cae0134f9b2858334c2b529 100644 --- a/extension/extension-opentelemetry/pom.xml +++ b/extension/extension-opentelemetry/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-extension - ${revision} + 1.2.1 ../pom.xml dynamic-tp-extension-opentelemetry diff --git a/extension/extension-opentelemetry/src/main/java/org/dromara/dynamictp/extension/opentelemetry/wrapper/OpenTelemetryWrapper.java b/extension/extension-opentelemetry/src/main/java/org/dromara/dynamictp/extension/opentelemetry/wrapper/OpenTelemetryWrapper.java index a7920005420e589151501920874490434924e9d6..a0619ce72fea94878cfef7f5a3ba3e88a82962a5 100644 --- a/extension/extension-opentelemetry/src/main/java/org/dromara/dynamictp/extension/opentelemetry/wrapper/OpenTelemetryWrapper.java +++ b/extension/extension-opentelemetry/src/main/java/org/dromara/dynamictp/extension/opentelemetry/wrapper/OpenTelemetryWrapper.java @@ -43,8 +43,7 @@ public class OpenTelemetryWrapper implements TaskWrapper { @Override public Runnable wrap(Runnable runnable) { Context context = Context.current(); - //把Trace信息传入DynamicTP中 - MDC.put(TRACE_ID, Span.current().getSpanContext().getTraceId()); + MDC.put(TRACE_ID, Span.current().getSpanContext().getTraceId()); // 被wrap方法包装后,该Executor执行的所有Runnable都会跑在特定的context中 return MdcRunnable.get(context.wrap(runnable)); } diff --git a/extension/extension-skywalking/pom.xml b/extension/extension-skywalking/pom.xml index 019485e9185aa7fb9e2044a89ca873c9d165fcfd..55bd65c9f15665b022e313f639496513e35be824 100644 --- a/extension/extension-skywalking/pom.xml +++ b/extension/extension-skywalking/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-extension - ${revision} + 1.2.1 ../pom.xml diff --git a/extension/pom.xml b/extension/pom.xml index a2d20349dfc3917c555300777e54df6e26c8f01a..af0a847758a5dc5132848c16eadd1fbb70ac9432 100644 --- a/extension/pom.xml +++ b/extension/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-all - ${revision} + 1.2.1 ../pom.xml dynamic-tp-extension diff --git a/jvmti/jvmti-build/pom.xml b/jvmti/jvmti-build/pom.xml index 33a70551ba07b7b9d9d6dea314b690142940a04c..6d432d880a9ae87f0bb5ce08cd825a3a9afe403f 100644 --- a/jvmti/jvmti-build/pom.xml +++ b/jvmti/jvmti-build/pom.xml @@ -4,7 +4,7 @@ org.dromara.dynamictp dynamic-tp-jvmti - ${revision} + 1.2.1 ../pom.xml dynamic-tp-jvmti-build diff --git a/jvmti/jvmti-runtime/pom.xml b/jvmti/jvmti-runtime/pom.xml index d16ced4fd1da6b0e356852c6ad69659a66fc9d35..b332b4f245229db381c2d0edcbc3c3ab0a08a484 100644 --- a/jvmti/jvmti-runtime/pom.xml +++ b/jvmti/jvmti-runtime/pom.xml @@ -4,7 +4,7 @@ org.dromara.dynamictp dynamic-tp-jvmti - ${revision} + 1.2.1 ../pom.xml dynamic-tp-jvmti-runtime diff --git a/jvmti/pom.xml b/jvmti/pom.xml index 5245ae3b462b273262d15165eaf59243134d637c..d5afd173354fe839e2e597621478e01550d10458 100644 --- a/jvmti/pom.xml +++ b/jvmti/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-all - ${revision} + 1.2.1 ../pom.xml dynamic-tp-jvmti @@ -17,4 +17,4 @@ jvmti-runtime - \ No newline at end of file + diff --git a/logging/pom.xml b/logging/pom.xml index f2ac2b0426427f7a3fbc48330f76086adbe55a72..9962f17dea53fd97d08c4b9ca91ad65773d613db 100644 --- a/logging/pom.xml +++ b/logging/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-all - ${revision} + 1.2.1 ../pom.xml dynamic-tp-logging @@ -45,11 +45,5 @@ log4j-slf4j-impl true - - - org.springframework.cloud - spring-cloud-context - true - diff --git a/logging/src/main/java/org/dromara/dynamictp/logging/AbstractDtpLogging.java b/logging/src/main/java/org/dromara/dynamictp/logging/AbstractDtpLogging.java index 6e24400cc7505dda6cb286c2aeb766a82c0e744b..a61f97fc32854c5ff8a8bad4c95c7d8795f67b09 100644 --- a/logging/src/main/java/org/dromara/dynamictp/logging/AbstractDtpLogging.java +++ b/logging/src/main/java/org/dromara/dynamictp/logging/AbstractDtpLogging.java @@ -17,10 +17,10 @@ package org.dromara.dynamictp.logging; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; -import org.dromara.dynamictp.common.properties.DtpProperties; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; +import org.dromara.dynamictp.common.properties.DtpProperties; import java.io.File; import java.io.FileNotFoundException; @@ -40,11 +40,10 @@ public abstract class AbstractDtpLogging { protected static final String MONITOR_LOG_NAME = "DTP.MONITOR.LOG"; private static final String CLASSPATH_PREFIX = "classpath:"; private static final String LOGGING_PATH = "LOG.PATH"; - private static final String APP_NAME = "APP.NAME"; static { try { - DtpProperties dtpProperties = ApplicationContextHolder.getBean(DtpProperties.class); + DtpProperties dtpProperties = ContextManagerHelper.getBean(DtpProperties.class); String logPath = dtpProperties.getLogPath(); if (StringUtils.isBlank(logPath)) { String userHome = System.getProperty("user.home"); @@ -52,17 +51,12 @@ public abstract class AbstractDtpLogging { } else { System.setProperty(LOGGING_PATH, logPath); } - - String appName = ApplicationContextHolder.getEnvironment().getProperty("spring.application.name"); - appName = StringUtils.isNotBlank(appName) ? appName : "application"; - System.setProperty(APP_NAME, appName); } catch (Exception e) { log.error("DynamicTp logging env init failed, if collectType is not logging, this error can be ignored.", e); } } public URL getResourceUrl(String resource) throws IOException { - if (resource.startsWith(CLASSPATH_PREFIX)) { String path = resource.substring(CLASSPATH_PREFIX.length()); ClassLoader classLoader = DtpLoggingInitializer.class.getClassLoader(); diff --git a/pom.xml b/pom.xml index 10417debae6b759241cc14cc1d033b0e790a07f5..af49b25c5f43c543b30d87e45bba5aa64d188ec7 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-all - ${revision} + 1.2.1 pom DynamicTp Project @@ -13,7 +13,7 @@ https://github.com/yanhom1314/dynamic-tp - 1.1.8-beta + 1.2.1 8 8 @@ -24,8 +24,7 @@ 31.1-jre 4.4 - 1.3.0 - 3.1.0 + 1.7.0 3.8.1 2.4 3.2.0 @@ -33,8 +32,7 @@ 1.6.7 3.7.1 3.1.0 - - 3.3.0 + 0.6.0 @@ -43,11 +41,13 @@ common starter logging - example + extension jvmti test - dependencies + + spring + benchmark @@ -104,14 +104,6 @@ pom import - - - cglib - cglib - ${cglib.version} - pom - import - @@ -162,7 +154,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - ${maven-checkstyle-plugin.verion} + ${maven-checkstyle-plugin.version} .github/checkstyle/checkstyle.xml false @@ -207,6 +199,7 @@ + attach-sources package jar-no-fork @@ -221,7 +214,8 @@ ${maven-javadoc-plugin.version} - package + attach-javadocs + package jar @@ -229,20 +223,23 @@ - - org.apache.maven.plugins - maven-jar-plugin - - - - ${project.artifactId} - ${project.version} - ${maven.build.timestamp} - yanhom - - - - + + + + + + + + + + + + + + + + + @@ -259,6 +256,17 @@ + + + + + + + + + + + org.sonatype.plugins nexus-staging-maven-plugin @@ -283,31 +291,31 @@ - - org.codehaus.mojo - flatten-maven-plugin - ${maven-flatten.version} - - true - resolveCiFriendliesOnly - - - - flatten - process-resources - - flatten - - - - flatten.clean - clean - - clean - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/img/zsxq.jpg b/resources/img/zsxq.jpg deleted file mode 100644 index dc2db149792ee5bc7d256e94818d6b3faa197703..0000000000000000000000000000000000000000 Binary files a/resources/img/zsxq.jpg and /dev/null differ diff --git a/resources/img/zsxq.png b/resources/img/zsxq.png new file mode 100644 index 0000000000000000000000000000000000000000..27a9a07612b847393d90dcafd861f98efd02cf60 Binary files /dev/null and b/resources/img/zsxq.png differ diff --git a/spring/pom.xml b/spring/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..4a7c449fd7ae7b7f1b1e75d874bdc0e3cc490f8a --- /dev/null +++ b/spring/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + org.dromara.dynamictp + dynamic-tp-all + 1.2.1 + ../pom.xml + + dynamic-tp-spring + + + + org.springframework + spring-context + + + + org.dromara.dynamictp + dynamic-tp-core + + + + diff --git a/spring/src/main/java/org/dromara/dynamictp/spring/AbstractSpringRefresher.java b/spring/src/main/java/org/dromara/dynamictp/spring/AbstractSpringRefresher.java new file mode 100644 index 0000000000000000000000000000000000000000..15810bb5ddff233650a883ea96bc7cd72fbc078b --- /dev/null +++ b/spring/src/main/java/org/dromara/dynamictp/spring/AbstractSpringRefresher.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.spring; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.common.properties.DtpProperties; +import org.dromara.dynamictp.core.refresher.AbstractRefresher; +import org.springframework.context.EnvironmentAware; +import org.springframework.core.env.Environment; + +/** + * Abstract class for refreshing properties in a Spring environment. + * + * @author vzer200 + * @since 1.2.0 + */ +@Slf4j +public abstract class AbstractSpringRefresher extends AbstractRefresher implements EnvironmentAware { + + protected Environment environment; + + protected AbstractSpringRefresher(DtpProperties dtpProperties) { + super(dtpProperties); + } + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } + +} diff --git a/core/src/main/java/org/dromara/dynamictp/core/spring/DtpBaseBeanConfiguration.java b/spring/src/main/java/org/dromara/dynamictp/spring/DtpBaseBeanConfiguration.java similarity index 76% rename from core/src/main/java/org/dromara/dynamictp/core/spring/DtpBaseBeanConfiguration.java rename to spring/src/main/java/org/dromara/dynamictp/spring/DtpBaseBeanConfiguration.java index ee7441d4f2026fcfe0ae84f1b44f9d95982a7ce4..e3ea07088791cb9f038ec48cbeecd47628d81806 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/spring/DtpBaseBeanConfiguration.java +++ b/spring/src/main/java/org/dromara/dynamictp/spring/DtpBaseBeanConfiguration.java @@ -15,12 +15,16 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.spring; +package org.dromara.dynamictp.spring; import org.dromara.dynamictp.common.properties.DtpProperties; import org.dromara.dynamictp.core.DtpRegistry; +import org.dromara.dynamictp.core.lifecycle.DtpLifecycle; +import org.dromara.dynamictp.core.lifecycle.LifeCycleManagement; import org.dromara.dynamictp.core.monitor.DtpMonitor; import org.dromara.dynamictp.core.support.DtpBannerPrinter; +import org.dromara.dynamictp.spring.lifecycle.DtpLifecycleSpringAdapter; +import org.dromara.dynamictp.spring.listener.DtpApplicationListener; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -60,4 +64,14 @@ public class DtpBaseBeanConfiguration { public DtpBannerPrinter dtpBannerPrinter() { return new DtpBannerPrinter(); } + + @Bean + public DtpLifecycleSpringAdapter dtpLifecycleSpringAdapter(LifeCycleManagement lifeCycleManagement) { + return new DtpLifecycleSpringAdapter(lifeCycleManagement); + } + + @Bean + public DtpApplicationListener dtpApplicationListener() { + return new DtpApplicationListener(); + } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/spring/DtpPostProcessor.java b/spring/src/main/java/org/dromara/dynamictp/spring/DtpPostProcessor.java similarity index 93% rename from core/src/main/java/org/dromara/dynamictp/core/spring/DtpPostProcessor.java rename to spring/src/main/java/org/dromara/dynamictp/spring/DtpPostProcessor.java index 8496f1462769a38b3c4df88596776a731349240a..d2c28513771323ef68f233bc5042eed1ffada3d3 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/spring/DtpPostProcessor.java +++ b/spring/src/main/java/org/dromara/dynamictp/spring/DtpPostProcessor.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.spring; +package org.dromara.dynamictp.spring; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; @@ -30,9 +30,10 @@ import org.dromara.dynamictp.core.executor.eager.EagerDtpExecutor; import org.dromara.dynamictp.core.executor.eager.TaskQueue; import org.dromara.dynamictp.core.support.DynamicTp; import org.dromara.dynamictp.core.support.ExecutorWrapper; -import org.dromara.dynamictp.core.support.ScheduledThreadPoolExecutorProxy; -import org.dromara.dynamictp.core.support.ThreadPoolExecutorProxy; +import org.dromara.dynamictp.core.support.proxy.ScheduledThreadPoolExecutorProxy; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; import org.dromara.dynamictp.core.support.task.wrapper.TaskWrapper; +import org.dromara.dynamictp.core.support.task.wrapper.TaskWrappers; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; @@ -146,7 +147,7 @@ public class DtpPostProcessor implements BeanPostProcessor, BeanFactoryAware, Pr val proxy = newProxy(poolName, poolTaskExecutor.getThreadPoolExecutor()); try { ReflectionUtil.setFieldValue("threadPoolExecutor", bean, proxy); - tryWrapTaskDecorator(poolTaskExecutor, proxy); + tryWrapTaskDecorator(poolName, poolTaskExecutor, proxy); } catch (IllegalAccessException ignored) { } DtpRegistry.registerExecutor(new ExecutorWrapper(poolName, proxy), REGISTER_SOURCE); return bean; @@ -183,7 +184,7 @@ public class DtpPostProcessor implements BeanPostProcessor, BeanFactoryAware, Pr return proxy; } - private void tryWrapTaskDecorator(ThreadPoolTaskExecutor poolTaskExecutor, ThreadPoolExecutorProxy proxy) throws IllegalAccessException { + private void tryWrapTaskDecorator(String poolName, ThreadPoolTaskExecutor poolTaskExecutor, ThreadPoolExecutorProxy proxy) throws IllegalAccessException { Object taskDecorator = ReflectionUtil.getFieldValue("taskDecorator", poolTaskExecutor); if (Objects.isNull(taskDecorator)) { return; @@ -191,7 +192,7 @@ public class DtpPostProcessor implements BeanPostProcessor, BeanFactoryAware, Pr TaskWrapper taskWrapper = (taskDecorator instanceof TaskWrapper) ? (TaskWrapper) taskDecorator : new TaskWrapper() { @Override public String name() { - return taskDecorator.getClass().getName(); + return poolName + "#taskDecorator"; } @Override @@ -200,5 +201,6 @@ public class DtpPostProcessor implements BeanPostProcessor, BeanFactoryAware, Pr } }; ReflectionUtil.setFieldValue("taskWrappers", proxy, Lists.newArrayList(taskWrapper)); + TaskWrappers.getInstance().register(taskWrapper); } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/spring/DtpBaseBeanDefinitionRegistrar.java b/spring/src/main/java/org/dromara/dynamictp/spring/annotation/DtpBaseBeanDefinitionRegistrar.java similarity index 80% rename from core/src/main/java/org/dromara/dynamictp/core/spring/DtpBaseBeanDefinitionRegistrar.java rename to spring/src/main/java/org/dromara/dynamictp/spring/annotation/DtpBaseBeanDefinitionRegistrar.java index c0195330dc861ffe008cde4cef8e755a5497edc4..f62a75088d14a51201d6f20d4da93f51f6490394 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/spring/DtpBaseBeanDefinitionRegistrar.java +++ b/spring/src/main/java/org/dromara/dynamictp/spring/annotation/DtpBaseBeanDefinitionRegistrar.java @@ -15,13 +15,15 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.spring; +package org.dromara.dynamictp.spring.annotation; import com.google.common.collect.Lists; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; -import org.dromara.dynamictp.common.spring.SpringBeanHelper; + import org.dromara.dynamictp.common.timer.HashedWheelTimer; import org.dromara.dynamictp.core.executor.NamedThreadFactory; +import org.dromara.dynamictp.spring.DtpPostProcessor; +import org.dromara.dynamictp.spring.holder.SpringContextHolder; +import org.dromara.dynamictp.spring.util.BeanRegistrationUtil; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.type.AnnotationMetadata; @@ -45,10 +47,10 @@ public class DtpBaseBeanDefinitionRegistrar implements ImportBeanDefinitionRegis @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { registerHashedWheelTimer(registry); - SpringBeanHelper.registerIfAbsent(registry, APPLICATION_CONTEXT_HOLDER, ApplicationContextHolder.class); + BeanRegistrationUtil.registerIfAbsent(registry, APPLICATION_CONTEXT_HOLDER, SpringContextHolder.class); // ApplicationContextHolder and HashedWheelTimer are required in DtpExecutor execute method, so they must be registered first - SpringBeanHelper.registerIfAbsent(registry, DTP_POST_PROCESSOR, DtpPostProcessor.class, + BeanRegistrationUtil.registerIfAbsent(registry, DTP_POST_PROCESSOR, DtpPostProcessor.class, null, Lists.newArrayList(APPLICATION_CONTEXT_HOLDER, HASHED_WHEEL_TIMER)); } @@ -58,6 +60,6 @@ public class DtpBaseBeanDefinitionRegistrar implements ImportBeanDefinitionRegis 10, TimeUnit.MILLISECONDS }; - SpringBeanHelper.registerIfAbsent(registry, HASHED_WHEEL_TIMER, HashedWheelTimer.class, constructorArgs); + BeanRegistrationUtil.registerIfAbsent(registry, HASHED_WHEEL_TIMER, HashedWheelTimer.class, constructorArgs); } } diff --git a/core/src/main/java/org/dromara/dynamictp/core/spring/DtpBeanDefinitionRegistrar.java b/spring/src/main/java/org/dromara/dynamictp/spring/annotation/DtpBeanDefinitionRegistrar.java similarity index 75% rename from core/src/main/java/org/dromara/dynamictp/core/spring/DtpBeanDefinitionRegistrar.java rename to spring/src/main/java/org/dromara/dynamictp/spring/annotation/DtpBeanDefinitionRegistrar.java index a01caf296cc77da4ca5250ac41adf30293f9169f..bcd09b8493cddfd67e88ac8b279c3b5156c33f99 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/spring/DtpBeanDefinitionRegistrar.java +++ b/spring/src/main/java/org/dromara/dynamictp/spring/annotation/DtpBeanDefinitionRegistrar.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.spring; +package org.dromara.dynamictp.spring.annotation; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; @@ -23,15 +23,15 @@ import lombok.val; import org.apache.commons.collections4.CollectionUtils; import org.dromara.dynamictp.common.entity.DtpExecutorProps; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.SpringBeanHelper; import org.dromara.dynamictp.core.executor.ExecutorType; import org.dromara.dynamictp.core.executor.NamedThreadFactory; import org.dromara.dynamictp.core.executor.eager.EagerDtpExecutor; import org.dromara.dynamictp.core.executor.eager.TaskQueue; import org.dromara.dynamictp.core.executor.priority.PriorityDtpExecutor; import org.dromara.dynamictp.core.reject.RejectHandlerGetter; -import org.dromara.dynamictp.core.support.BinderHelper; +import org.dromara.dynamictp.core.support.binder.BinderHelper; import org.dromara.dynamictp.core.support.task.wrapper.TaskWrappers; +import org.dromara.dynamictp.spring.util.BeanRegistrationUtil; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; @@ -42,23 +42,7 @@ import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.PriorityBlockingQueue; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.ALLOW_CORE_THREAD_TIMEOUT; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.AWAIT_TERMINATION_SECONDS; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.AWARE_NAMES; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.NOTIFY_ENABLED; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.NOTIFY_ITEMS; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.PLATFORM_IDS; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.PLUGIN_NAMES; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.PRE_START_ALL_CORE_THREADS; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.QUEUE_TIMEOUT; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.REJECT_ENHANCED; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.REJECT_HANDLER_TYPE; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.RUN_TIMEOUT; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.TASK_WRAPPERS; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.THREAD_POOL_ALIAS_NAME; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.THREAD_POOL_NAME; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.TRY_INTERRUPT_WHEN_TIMEOUT; -import static org.dromara.dynamictp.common.constant.DynamicTpConst.WAIT_FOR_TASKS_TO_COMPLETE_ON_SHUTDOWN; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.*; import static org.dromara.dynamictp.common.em.QueueTypeEnum.buildLbq; import static org.dromara.dynamictp.common.entity.NotifyItem.mergeAllNotifyItems; @@ -84,15 +68,18 @@ public class DtpBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar BinderHelper.bindDtpProperties(environment, dtpProperties); val executors = dtpProperties.getExecutors(); if (CollectionUtils.isEmpty(executors)) { - log.warn("DynamicTp registrar, no executors are configured."); + log.info("DynamicTp registrar, no executors are configured."); return; } executors.forEach(e -> { + if (!e.isAutoCreate()) { + return; + } Class executorTypeClass = ExecutorType.getClass(e.getExecutorType()); Map propertyValues = buildPropertyValues(e); Object[] args = buildConstructorArgs(executorTypeClass, e); - SpringBeanHelper.register(registry, e.getThreadPoolName(), executorTypeClass, propertyValues, args); + BeanRegistrationUtil.register(registry, e.getThreadPoolName(), executorTypeClass, propertyValues, args); }); } @@ -106,9 +93,9 @@ public class DtpBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar propertyValues.put(PRE_START_ALL_CORE_THREADS, props.isPreStartAllCoreThreads()); propertyValues.put(REJECT_HANDLER_TYPE, props.getRejectedHandlerType()); propertyValues.put(REJECT_ENHANCED, props.isRejectEnhanced()); - propertyValues.put(RUN_TIMEOUT, props.getRunTimeout()); + propertyValues.put(RUN_TIMEOUT_PROP, props.getRunTimeout()); propertyValues.put(TRY_INTERRUPT_WHEN_TIMEOUT, props.isTryInterrupt()); - propertyValues.put(QUEUE_TIMEOUT, props.getQueueTimeout()); + propertyValues.put(QUEUE_TIMEOUT_PROP, props.getQueueTimeout()); val notifyItems = mergeAllNotifyItems(props.getNotifyItems()); propertyValues.put(NOTIFY_ITEMS, notifyItems); propertyValues.put(PLATFORM_IDS, props.getPlatformIds()); @@ -144,5 +131,4 @@ public class DtpBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar RejectHandlerGetter.buildRejectedHandler(props.getRejectedHandlerType()) }; } - } diff --git a/core/src/main/java/org/dromara/dynamictp/core/spring/DtpConfigurationSelector.java b/spring/src/main/java/org/dromara/dynamictp/spring/annotation/DtpConfigurationSelector.java similarity index 94% rename from core/src/main/java/org/dromara/dynamictp/core/spring/DtpConfigurationSelector.java rename to spring/src/main/java/org/dromara/dynamictp/spring/annotation/DtpConfigurationSelector.java index 18751a7bf24d3c52e893e150983867bd55e8fd93..bc979277b91a283f93d0d182b8b648b8830b634b 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/spring/DtpConfigurationSelector.java +++ b/spring/src/main/java/org/dromara/dynamictp/spring/annotation/DtpConfigurationSelector.java @@ -15,9 +15,10 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.spring; +package org.dromara.dynamictp.spring.annotation; import org.apache.commons.lang3.BooleanUtils; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.DeferredImportSelector; import org.springframework.core.Ordered; diff --git a/core/src/main/java/org/dromara/dynamictp/core/spring/EnableDynamicTp.java b/spring/src/main/java/org/dromara/dynamictp/spring/annotation/EnableDynamicTp.java similarity index 96% rename from core/src/main/java/org/dromara/dynamictp/core/spring/EnableDynamicTp.java rename to spring/src/main/java/org/dromara/dynamictp/spring/annotation/EnableDynamicTp.java index 1dbd5cb179461bb9ce9e6b78813e78f4ad44e4fd..c1c54a00cc90e410fee20b5e68789e99ac82cedf 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/spring/EnableDynamicTp.java +++ b/spring/src/main/java/org/dromara/dynamictp/spring/annotation/EnableDynamicTp.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.spring; +package org.dromara.dynamictp.spring.annotation; import org.springframework.context.annotation.Import; diff --git a/common/src/main/java/org/dromara/dynamictp/common/spring/ApplicationContextHolder.java b/spring/src/main/java/org/dromara/dynamictp/spring/holder/SpringContextHolder.java similarity index 60% rename from common/src/main/java/org/dromara/dynamictp/common/spring/ApplicationContextHolder.java rename to spring/src/main/java/org/dromara/dynamictp/spring/holder/SpringContextHolder.java index 96d84f062edb2cc9d511abc8b4616ef537126b3a..d50941829260912892dae0fc51f864f953f5c677 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/spring/ApplicationContextHolder.java +++ b/spring/src/main/java/org/dromara/dynamictp/spring/holder/SpringContextHolder.java @@ -15,24 +15,24 @@ * limitations under the License. */ -package org.dromara.dynamictp.common.spring; +package org.dromara.dynamictp.spring.holder; +import org.dromara.dynamictp.common.manager.ContextManager; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ApplicationEvent; import org.springframework.core.env.Environment; import java.util.Map; import java.util.Objects; /** - * ApplicationContextHolder related + * Manages the Spring ApplicationContext and provides access to beans and environment properties. * - * @author yanhom - * @since 1.0.0 - **/ -public class ApplicationContextHolder implements ApplicationContextAware { + * @author vzer200 + * @since 1.2.0 + */ +public class SpringContextHolder implements ContextManager, ApplicationContextAware { private static ApplicationContext context; @@ -41,15 +41,18 @@ public class ApplicationContextHolder implements ApplicationContextAware { context = applicationContext; } - public static T getBean(Class clazz) { + @Override + public T getBean(Class clazz) { return getInstance().getBean(clazz); } - public static T getBean(String name, Class clazz) { + @Override + public T getBean(String name, Class clazz) { return getInstance().getBean(name, clazz); } - public static Map getBeansOfType(Class clazz) { + @Override + public Map getBeansOfType(Class clazz) { return getInstance().getBeansOfType(clazz); } @@ -60,12 +63,27 @@ public class ApplicationContextHolder implements ApplicationContextAware { return context; } - public static Environment getEnvironment() { + @Override + public Environment getEnvironment() { return getInstance().getEnvironment(); } - public static void publishEvent(ApplicationEvent event) { - getInstance().publishEvent(event); + @Override + public String getEnvironmentProperty(String key) { + return getEnvironment().getProperty(key); + } + + @Override + public String getEnvironmentProperty(String key, Object environment) { + if (environment instanceof Environment) { + Environment env = (Environment) environment; + return env.getProperty(key); + } + return null; } + @Override + public String getEnvironmentProperty(String key, String defaultValue) { + return getEnvironment().getProperty(key, defaultValue); + } } diff --git a/spring/src/main/java/org/dromara/dynamictp/spring/initializer/SpringDtpInitializer.java b/spring/src/main/java/org/dromara/dynamictp/spring/initializer/SpringDtpInitializer.java new file mode 100644 index 0000000000000000000000000000000000000000..898da01b98abe4cdda8997875b14e4ab99b71b67 --- /dev/null +++ b/spring/src/main/java/org/dromara/dynamictp/spring/initializer/SpringDtpInitializer.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.spring.initializer; + +import org.apache.commons.lang3.StringUtils; +import org.dromara.dynamictp.core.support.init.DtpInitializer; +import org.springframework.context.ConfigurableApplicationContext; + +import static org.dromara.dynamictp.common.constant.DynamicTpConst.APP_ENV_KEY; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.APP_NAME_KEY; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.APP_PORT_KEY; + +/** + * SpringDtpInitializer related + * + * @author yanhom + * @since 1.2.0 + */ +public class SpringDtpInitializer implements DtpInitializer { + + private static final String SPRING_APP_NAME_KEY = "spring.application.name"; + + private static final String SERVER_PORT = "server.port"; + + private static final String ACTIVE_PROFILES = "spring.profiles.active"; + + @Override + public String getName() { + return "SpringDtpInitializer"; + } + + @Override + public void init(Object... args) { + ConfigurableApplicationContext c = (ConfigurableApplicationContext) args[0]; + String appName = c.getEnvironment().getProperty(SPRING_APP_NAME_KEY, "application"); + String appPort = c.getEnvironment().getProperty(SERVER_PORT, "0"); + String appEnv = c.getEnvironment().getProperty(ACTIVE_PROFILES); + if (StringUtils.isBlank(appEnv)) { + // fix #I8SSGQ + String[] profiles = c.getEnvironment().getActiveProfiles(); + if (profiles.length < 1) { + profiles = c.getEnvironment().getDefaultProfiles(); + } + if (profiles.length >= 1) { + appEnv = profiles[0]; + } + } + if (StringUtils.isBlank(appEnv)) { + appEnv = "unknown"; + } + System.setProperty(APP_NAME_KEY, appName); + System.setProperty(APP_PORT_KEY, appPort); + System.setProperty(APP_ENV_KEY, appEnv); + } +} diff --git a/spring/src/main/java/org/dromara/dynamictp/spring/lifecycle/DtpLifecycleSpringAdapter.java b/spring/src/main/java/org/dromara/dynamictp/spring/lifecycle/DtpLifecycleSpringAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..4e2169319337b11ecbe16d89f78bfcf914cb282e --- /dev/null +++ b/spring/src/main/java/org/dromara/dynamictp/spring/lifecycle/DtpLifecycleSpringAdapter.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.spring.lifecycle; + +import org.dromara.dynamictp.core.lifecycle.LifeCycleManagement; +import org.springframework.context.SmartLifecycle; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Adapts LifeCycleManagement to Spring's SmartLifecycle interface. + * + * @author vzer200 + * @since 1.2.0 + */ +public class DtpLifecycleSpringAdapter implements SmartLifecycle { + + private final LifeCycleManagement lifeCycleManagement; + + private final AtomicBoolean running = new AtomicBoolean(false); + + public DtpLifecycleSpringAdapter(LifeCycleManagement lifeCycleManagement) { + this.lifeCycleManagement = lifeCycleManagement; + } + + @Override + public void start() { + if (this.running.compareAndSet(false, true)) { + lifeCycleManagement.start(); + } + } + + @Override + public void stop() { + if (this.running.compareAndSet(true, false)) { + lifeCycleManagement.stop(); + } + } + + @Override + public boolean isRunning() { + return this.running.get(); + } + + @Override + public void stop(Runnable callback) { + if (this.running.compareAndSet(true, false)) { + lifeCycleManagement.stop(callback); + } + } + + /** + * Compatible with lower versions of spring. + * + * @return isAutoStartup + */ + @Override + public boolean isAutoStartup() { + return lifeCycleManagement.isAutoStartup(); + } + + /** + * Compatible with lower versions of spring. + * + * @return phase + */ + @Override + public int getPhase() { + return lifeCycleManagement.getPhase(); + } +} diff --git a/spring/src/main/java/org/dromara/dynamictp/spring/listener/DtpApplicationListener.java b/spring/src/main/java/org/dromara/dynamictp/spring/listener/DtpApplicationListener.java new file mode 100644 index 0000000000000000000000000000000000000000..bd243a0837b9f5226a1100a21472171eaf8886c5 --- /dev/null +++ b/spring/src/main/java/org/dromara/dynamictp/spring/listener/DtpApplicationListener.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.spring.listener; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.common.event.CustomContextRefreshedEvent; +import org.dromara.dynamictp.common.manager.EventBusManager; +import org.springframework.context.event.ContextRefreshedEvent; + +/** + * DtpApplicationListener related + * + * @author vzer200 + * @since 1.2.0 + **/ +@Slf4j +public class DtpApplicationListener extends OnceApplicationContextEventListener { + + @Override + protected void onContextRefreshedEvent(ContextRefreshedEvent event) { + CustomContextRefreshedEvent refreshedEvent = new CustomContextRefreshedEvent(this); + EventBusManager.post(refreshedEvent); + } +} + diff --git a/common/src/main/java/org/dromara/dynamictp/common/spring/OnceApplicationContextEventListener.java b/spring/src/main/java/org/dromara/dynamictp/spring/listener/OnceApplicationContextEventListener.java similarity index 98% rename from common/src/main/java/org/dromara/dynamictp/common/spring/OnceApplicationContextEventListener.java rename to spring/src/main/java/org/dromara/dynamictp/spring/listener/OnceApplicationContextEventListener.java index afa1753d673cbd4f96752bd3dc6d32e4e0f47fb7..df92f601d8fe04dbb20a07e884305e6c93847ec2 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/spring/OnceApplicationContextEventListener.java +++ b/spring/src/main/java/org/dromara/dynamictp/spring/listener/OnceApplicationContextEventListener.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.dromara.dynamictp.common.spring; +package org.dromara.dynamictp.spring.listener; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; @@ -28,6 +28,7 @@ import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.ContextStartedEvent; import org.springframework.context.event.ContextStoppedEvent; + import static org.springframework.util.ObjectUtils.nullSafeEquals; /** @@ -105,4 +106,3 @@ public abstract class OnceApplicationContextEventListener implements Application } } - diff --git a/core/src/main/java/org/dromara/dynamictp/core/spring/YamlPropertySourceFactory.java b/spring/src/main/java/org/dromara/dynamictp/spring/support/YamlPropertySourceFactory.java similarity index 97% rename from core/src/main/java/org/dromara/dynamictp/core/spring/YamlPropertySourceFactory.java rename to spring/src/main/java/org/dromara/dynamictp/spring/support/YamlPropertySourceFactory.java index 320aafa626df22be7dcec1f1461946c72b269bda..c568d386872d4ffb683559b41847fc2322e01d52 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/spring/YamlPropertySourceFactory.java +++ b/spring/src/main/java/org/dromara/dynamictp/spring/support/YamlPropertySourceFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.dromara.dynamictp.core.spring; +package org.dromara.dynamictp.spring.support; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; diff --git a/common/src/main/java/org/dromara/dynamictp/common/spring/SpringBeanHelper.java b/spring/src/main/java/org/dromara/dynamictp/spring/util/BeanRegistrationUtil.java similarity index 97% rename from common/src/main/java/org/dromara/dynamictp/common/spring/SpringBeanHelper.java rename to spring/src/main/java/org/dromara/dynamictp/spring/util/BeanRegistrationUtil.java index 6011f0253670ffe4e0b74d615a61276d4e1266ef..cb0abcbfa849982c7a4f875ab29858786d4e3eaf 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/spring/SpringBeanHelper.java +++ b/spring/src/main/java/org/dromara/dynamictp/spring/util/BeanRegistrationUtil.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.dromara.dynamictp.common.spring; +package org.dromara.dynamictp.spring.util; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -35,9 +35,9 @@ import java.util.Map; * @since 1.0.4 **/ @Slf4j -public final class SpringBeanHelper { +public final class BeanRegistrationUtil { - private SpringBeanHelper() { } + private BeanRegistrationUtil() { } public static void register(BeanDefinitionRegistry registry, String beanName, diff --git a/spring/src/main/resources/META-INF/services/org.dromara.dynamictp.common.manager.ContextManager b/spring/src/main/resources/META-INF/services/org.dromara.dynamictp.common.manager.ContextManager new file mode 100644 index 0000000000000000000000000000000000000000..8f0c7531962b126065582b3c60dc3cb6756c7530 --- /dev/null +++ b/spring/src/main/resources/META-INF/services/org.dromara.dynamictp.common.manager.ContextManager @@ -0,0 +1 @@ +org.dromara.dynamictp.spring.holder.SpringContextHolder diff --git a/spring/src/main/resources/META-INF/services/org.dromara.dynamictp.core.support.init.DtpInitializer b/spring/src/main/resources/META-INF/services/org.dromara.dynamictp.core.support.init.DtpInitializer new file mode 100644 index 0000000000000000000000000000000000000000..327ad8d07286b955fc02c8d4e55f2ca4b9aa8f09 --- /dev/null +++ b/spring/src/main/resources/META-INF/services/org.dromara.dynamictp.core.support.init.DtpInitializer @@ -0,0 +1 @@ +org.dromara.dynamictp.spring.initializer.SpringDtpInitializer \ No newline at end of file diff --git a/starter/pom.xml b/starter/pom.xml index 9a5ea4d9e79b33bec733b5cbc3fd037dd4384780..4d22989ddbc66201d5c7a6a58ca9282e56b92131 100644 --- a/starter/pom.xml +++ b/starter/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-all - ${revision} + 1.2.1 ../pom.xml dynamic-tp-starter diff --git a/starter/starter-adapter/pom.xml b/starter/starter-adapter/pom.xml index 29e5e9b8efb55136d3964e58942cc2471207f589..ebd5f60ee46aa4d6643a920b216bd04c0e3954ea 100644 --- a/starter/starter-adapter/pom.xml +++ b/starter/starter-adapter/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-starter-adapter @@ -24,6 +24,8 @@ starter-adapter-tars starter-adapter-sofa starter-adapter-rabbitmq + starter-adapter-liteflow + starter-adapter-thrift diff --git a/starter/starter-adapter/starter-adapter-brpc/pom.xml b/starter/starter-adapter/starter-adapter-brpc/pom.xml index fae162f10b644baca5bbdbfb02fcb40b652289e9..54dd9b7968f2666eccb82f778cce28e5491b357d 100644 --- a/starter/starter-adapter/starter-adapter-brpc/pom.xml +++ b/starter/starter-adapter/starter-adapter-brpc/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-adapter-brpc diff --git a/starter/starter-adapter/starter-adapter-brpc/src/main/java/org/dromara/dynamictp/starter/adapter/brpc/autoconfigure/BrpcTpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-brpc/src/main/java/org/dromara/dynamictp/starter/adapter/brpc/autoconfigure/BrpcTpAutoConfiguration.java index 3d9403be975f0d2c49f7507f42a99061a1532e75..cf35f129c84a95a0b9886890a9ff9041042dc911 100644 --- a/starter/starter-adapter/starter-adapter-brpc/src/main/java/org/dromara/dynamictp/starter/adapter/brpc/autoconfigure/BrpcTpAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-brpc/src/main/java/org/dromara/dynamictp/starter/adapter/brpc/autoconfigure/BrpcTpAutoConfiguration.java @@ -19,7 +19,7 @@ package org.dromara.dynamictp.starter.adapter.brpc.autoconfigure; import org.dromara.dynamictp.apapter.brpc.client.StarlightClientDtpAdapter; import org.dromara.dynamictp.apapter.brpc.server.StarlightServerDtpAdapter; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/starter/starter-adapter/starter-adapter-common/pom.xml b/starter/starter-adapter/starter-adapter-common/pom.xml index 9072e5f00eee0d34748dce79435b1180cb43ed3d..5fbd8789e1c4e3ffbe29040e196b6e546687b7ed 100644 --- a/starter/starter-adapter/starter-adapter-common/pom.xml +++ b/starter/starter-adapter/starter-adapter-common/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-starter-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-adapter-common diff --git a/starter/starter-adapter/starter-adapter-common/src/main/java/org/dromara/dynamictp/starter/adapter/common/autoconfigure/AdapterCommonAutoConfiguration.java b/starter/starter-adapter/starter-adapter-common/src/main/java/org/dromara/dynamictp/starter/adapter/common/autoconfigure/AdapterCommonAutoConfiguration.java index f09cf2167cc6000417086303d2b03ef7c43dcb45..f7dd1086697589e1e7233972b3f103923dfaad01 100644 --- a/starter/starter-adapter/starter-adapter-common/src/main/java/org/dromara/dynamictp/starter/adapter/common/autoconfigure/AdapterCommonAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-common/src/main/java/org/dromara/dynamictp/starter/adapter/common/autoconfigure/AdapterCommonAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.adapter.common.autoconfigure; import org.dromara.dynamictp.adapter.common.DtpAdapterListener; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; diff --git a/starter/starter-adapter/starter-adapter-dubbo/pom.xml b/starter/starter-adapter/starter-adapter-dubbo/pom.xml index 5b7d9bf013465e76fa91b231c8f944eec173bc4a..e044f804eed522836afc36f872941a20944e1a48 100644 --- a/starter/starter-adapter/starter-adapter-dubbo/pom.xml +++ b/starter/starter-adapter/starter-adapter-dubbo/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-starter-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-adapter-dubbo diff --git a/starter/starter-adapter/starter-adapter-dubbo/src/main/java/org/dromara/dynamictp/starter/adapter/dubbo/autoconfigure/AlibabaDubboTpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-dubbo/src/main/java/org/dromara/dynamictp/starter/adapter/dubbo/autoconfigure/AlibabaDubboTpAutoConfiguration.java index c2adbf140d2d8a91b9e2b7733c768a0d6a0e972c..2df9704b25494973859e459da80f1964db2ba4c1 100644 --- a/starter/starter-adapter/starter-adapter-dubbo/src/main/java/org/dromara/dynamictp/starter/adapter/dubbo/autoconfigure/AlibabaDubboTpAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-dubbo/src/main/java/org/dromara/dynamictp/starter/adapter/dubbo/autoconfigure/AlibabaDubboTpAutoConfiguration.java @@ -18,8 +18,8 @@ package org.dromara.dynamictp.starter.adapter.dubbo.autoconfigure; import org.dromara.dynamictp.adapter.dubbo.alibaba.AlibabaDubboDtpAdapter; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.dromara.dynamictp.starter.adapter.dubbo.autoconfigure.condition.ConditionOnAlibabaDubboApp; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; diff --git a/starter/starter-adapter/starter-adapter-dubbo/src/main/java/org/dromara/dynamictp/starter/adapter/dubbo/autoconfigure/ApacheDubboTpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-dubbo/src/main/java/org/dromara/dynamictp/starter/adapter/dubbo/autoconfigure/ApacheDubboTpAutoConfiguration.java index a9a5a9c8f6d304656599cd48bc04256b614eb04a..b1c11e331241c18f194a09968269a61c6357dcbc 100644 --- a/starter/starter-adapter/starter-adapter-dubbo/src/main/java/org/dromara/dynamictp/starter/adapter/dubbo/autoconfigure/ApacheDubboTpAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-dubbo/src/main/java/org/dromara/dynamictp/starter/adapter/dubbo/autoconfigure/ApacheDubboTpAutoConfiguration.java @@ -18,8 +18,8 @@ package org.dromara.dynamictp.starter.adapter.dubbo.autoconfigure; import org.dromara.dynamictp.adapter.dubbo.apache.ApacheDubboDtpAdapter; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.dromara.dynamictp.starter.adapter.dubbo.autoconfigure.condition.ConditionOnApacheDubboApp; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; diff --git a/starter/starter-adapter/starter-adapter-grpc/pom.xml b/starter/starter-adapter/starter-adapter-grpc/pom.xml index 40655d60e8e2933acf7829163665286293cce382..d1508d75634a859d5fab868cf73f9ee54c20042e 100644 --- a/starter/starter-adapter/starter-adapter-grpc/pom.xml +++ b/starter/starter-adapter/starter-adapter-grpc/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-adapter-grpc diff --git a/starter/starter-adapter/starter-adapter-grpc/src/main/java/org/dromara/dynamictp/starter/adapter/grpc/autoconfigure/GrpcTpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-grpc/src/main/java/org/dromara/dynamictp/starter/adapter/grpc/autoconfigure/GrpcTpAutoConfiguration.java index 7860535b370650f9a614761952a70b9bfe9a9247..d28b85778485dd78dfdc5f3b2a3e30cda35ea25a 100644 --- a/starter/starter-adapter/starter-adapter-grpc/src/main/java/org/dromara/dynamictp/starter/adapter/grpc/autoconfigure/GrpcTpAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-grpc/src/main/java/org/dromara/dynamictp/starter/adapter/grpc/autoconfigure/GrpcTpAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.adapter.grpc.autoconfigure; import org.dromara.dynamictp.adapter.grpc.GrpcDtpAdapter; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/starter/starter-adapter/starter-adapter-hystrix/pom.xml b/starter/starter-adapter/starter-adapter-hystrix/pom.xml index bbdac9a9e33bd0daa0767367ce925068f8c037df..8a1788c21b4f8bdef27dc270608af102fb7b6194 100644 --- a/starter/starter-adapter/starter-adapter-hystrix/pom.xml +++ b/starter/starter-adapter/starter-adapter-hystrix/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-starter-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-adapter-hystrix diff --git a/starter/starter-adapter/starter-adapter-hystrix/src/main/java/org/dromara/dynamictp/starter/adapter/hystrix/autoconfigure/HystrixTpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-hystrix/src/main/java/org/dromara/dynamictp/starter/adapter/hystrix/autoconfigure/HystrixTpAutoConfiguration.java index f4c00167e49dc9a449c9b5e96b112279e40119da..d944f979f1ebe27a70f09dc6fcfa3205af13abea 100644 --- a/starter/starter-adapter/starter-adapter-hystrix/src/main/java/org/dromara/dynamictp/starter/adapter/hystrix/autoconfigure/HystrixTpAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-hystrix/src/main/java/org/dromara/dynamictp/starter/adapter/hystrix/autoconfigure/HystrixTpAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.adapter.hystrix.autoconfigure; import org.dromara.dynamictp.adapter.hystrix.HystrixDtpAdapter; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/starter/starter-adapter/starter-adapter-liteflow/pom.xml b/starter/starter-adapter/starter-adapter-liteflow/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..cf8c435e317262d20bb3e9ac6218eca0b0da718a --- /dev/null +++ b/starter/starter-adapter/starter-adapter-liteflow/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + org.dromara.dynamictp + dynamic-tp-starter-adapter + 1.2.1 + ../pom.xml + + dynamic-tp-spring-boot-starter-adapter-liteflow + + + + org.dromara.dynamictp + dynamic-tp-spring-boot-starter-adapter-common + + + + org.dromara.dynamictp + dynamic-tp-adapter-liteflow + + + diff --git a/starter/starter-adapter/starter-adapter-liteflow/src/main/java/org/dromara/dynamictp/starter/adapter/liteflow/autoconfigure/LiteflowTpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-liteflow/src/main/java/org/dromara/dynamictp/starter/adapter/liteflow/autoconfigure/LiteflowTpAutoConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..696e4c0a2f9d711e54dbf76496e0e63b43dc8eb1 --- /dev/null +++ b/starter/starter-adapter/starter-adapter-liteflow/src/main/java/org/dromara/dynamictp/starter/adapter/liteflow/autoconfigure/LiteflowTpAutoConfiguration.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.starter.adapter.liteflow.autoconfigure; + +import org.dromara.dynamictp.adapter.liteflow.LiteflowDtpAdapter; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * LiteflowTpAutoConfiguration related + * + * @author yanhom + * @since 1.1.9 + */ +@Configuration +@ConditionalOnClass(name = "com.yomahub.liteflow.core.FlowExecutor") +@ConditionalOnBean({DtpBaseBeanConfiguration.class}) +@AutoConfigureAfter({DtpBaseBeanConfiguration.class}) +public class LiteflowTpAutoConfiguration { + + @Bean + @ConditionalOnMissingBean + public LiteflowDtpAdapter liteflowDtpAdapter() { + return new LiteflowDtpAdapter(); + } +} diff --git a/starter/starter-adapter/starter-adapter-liteflow/src/main/resources/META-INF/spring.factories b/starter/starter-adapter/starter-adapter-liteflow/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000000000000000000000000000000000..31a4216c4c0b605c6c7d91ddd53ef934d3360402 --- /dev/null +++ b/starter/starter-adapter/starter-adapter-liteflow/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + org.dromara.dynamictp.starter.adapter.liteflow.autoconfigure.LiteflowTpAutoConfiguration \ No newline at end of file diff --git a/starter/starter-adapter/starter-adapter-motan/pom.xml b/starter/starter-adapter/starter-adapter-motan/pom.xml index a921c95bdcde4158e992bd348c962e877c21b6d6..4f117582cb22dc580436acb67ad76b8655108ef7 100644 --- a/starter/starter-adapter/starter-adapter-motan/pom.xml +++ b/starter/starter-adapter/starter-adapter-motan/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-adapter-motan diff --git a/starter/starter-adapter/starter-adapter-motan/src/main/java/org/dromara/dynamictp/starter/adapter/motan/autoconfigure/MotanTpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-motan/src/main/java/org/dromara/dynamictp/starter/adapter/motan/autoconfigure/MotanTpAutoConfiguration.java index 0d18895f5e9c30ed62da0f63206eed4f9cd37b86..7b2456ea47f2957f2f9e2e1368e9aca0e108501d 100644 --- a/starter/starter-adapter/starter-adapter-motan/src/main/java/org/dromara/dynamictp/starter/adapter/motan/autoconfigure/MotanTpAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-motan/src/main/java/org/dromara/dynamictp/starter/adapter/motan/autoconfigure/MotanTpAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.adapter.motan.autoconfigure; import org.dromara.dynamictp.adapter.motan.MotanDtpAdapter; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/starter/starter-adapter/starter-adapter-okhttp3/pom.xml b/starter/starter-adapter/starter-adapter-okhttp3/pom.xml index 845c40340f56c6c4501b03b8d8e0cce6a0980cb4..fcb1ba027f6e7af795a9893fe83dec7282c45cf0 100644 --- a/starter/starter-adapter/starter-adapter-okhttp3/pom.xml +++ b/starter/starter-adapter/starter-adapter-okhttp3/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-adapter-okhttp3 diff --git a/starter/starter-adapter/starter-adapter-okhttp3/src/main/java/org/dromara/dynamictp/starter/adapter/okhttp3/autoconfigure/Okhttp3TpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-okhttp3/src/main/java/org/dromara/dynamictp/starter/adapter/okhttp3/autoconfigure/Okhttp3TpAutoConfiguration.java index eb81039a1fa48339ce86a600c96274248511ae6a..b38fd4c0b16557236cc18328ae8b9d41e2ebb688 100644 --- a/starter/starter-adapter/starter-adapter-okhttp3/src/main/java/org/dromara/dynamictp/starter/adapter/okhttp3/autoconfigure/Okhttp3TpAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-okhttp3/src/main/java/org/dromara/dynamictp/starter/adapter/okhttp3/autoconfigure/Okhttp3TpAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.adapter.okhttp3.autoconfigure; import org.dromara.dynamictp.adapter.okhttp3.Okhttp3DtpAdapter; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/starter/starter-adapter/starter-adapter-rabbitmq/pom.xml b/starter/starter-adapter/starter-adapter-rabbitmq/pom.xml index 0a6b787d58e33d9350bcebb03bf535b3dc590b27..1f7c4ef8632fc71e6d3660195bbe83eb66d3be8b 100644 --- a/starter/starter-adapter/starter-adapter-rabbitmq/pom.xml +++ b/starter/starter-adapter/starter-adapter-rabbitmq/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-starter-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-adapter-rabbitmq diff --git a/starter/starter-adapter/starter-adapter-rabbitmq/src/main/java/org/dromara/dynamictp/starter/adapter/rabbitmq/autoconfigure/RabbitMqTpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-rabbitmq/src/main/java/org/dromara/dynamictp/starter/adapter/rabbitmq/autoconfigure/RabbitMqTpAutoConfiguration.java index 22ace78119379e03faf1a91bb80cb4f91dbcd26e..f9dc959be12e0d88c325d2b7f3ce2240cb1eab34 100644 --- a/starter/starter-adapter/starter-adapter-rabbitmq/src/main/java/org/dromara/dynamictp/starter/adapter/rabbitmq/autoconfigure/RabbitMqTpAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-rabbitmq/src/main/java/org/dromara/dynamictp/starter/adapter/rabbitmq/autoconfigure/RabbitMqTpAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.adapter.rabbitmq.autoconfigure; import org.dromara.dynamictp.adapter.rabbitmq.RabbitMqDtpAdapter; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/starter/starter-adapter/starter-adapter-rocketmq/pom.xml b/starter/starter-adapter/starter-adapter-rocketmq/pom.xml index 094c516a875364ba5cf117de0694629b955965ac..5feee39238aa26ecefeef69105ff0135331e820d 100644 --- a/starter/starter-adapter/starter-adapter-rocketmq/pom.xml +++ b/starter/starter-adapter/starter-adapter-rocketmq/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-starter-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-adapter-rocketmq diff --git a/starter/starter-adapter/starter-adapter-rocketmq/src/main/java/org/dromara/dynamictp/starter/adapter/rocketmq/autoconfigure/AliyunOnsRocketMqAutoConfiguration.java b/starter/starter-adapter/starter-adapter-rocketmq/src/main/java/org/dromara/dynamictp/starter/adapter/rocketmq/autoconfigure/AliyunOnsRocketMqAutoConfiguration.java index 42903d11859dacd4d19c6897f38a22ccb939ee22..889f0c63fa7274a9d4d3a2044b9800c42364b386 100644 --- a/starter/starter-adapter/starter-adapter-rocketmq/src/main/java/org/dromara/dynamictp/starter/adapter/rocketmq/autoconfigure/AliyunOnsRocketMqAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-rocketmq/src/main/java/org/dromara/dynamictp/starter/adapter/rocketmq/autoconfigure/AliyunOnsRocketMqAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.adapter.rocketmq.autoconfigure; import org.dromara.dynamictp.adapter.rocketmq.AliyunOnsRocketMqAdapter; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/starter/starter-adapter/starter-adapter-rocketmq/src/main/java/org/dromara/dynamictp/starter/adapter/rocketmq/autoconfigure/RocketMqTpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-rocketmq/src/main/java/org/dromara/dynamictp/starter/adapter/rocketmq/autoconfigure/RocketMqTpAutoConfiguration.java index df99d1e5756cdac7258245e34cbfd5d5725a0bea..46681282c9f6373ee3d074f133c0204a404f4bf5 100644 --- a/starter/starter-adapter/starter-adapter-rocketmq/src/main/java/org/dromara/dynamictp/starter/adapter/rocketmq/autoconfigure/RocketMqTpAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-rocketmq/src/main/java/org/dromara/dynamictp/starter/adapter/rocketmq/autoconfigure/RocketMqTpAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.adapter.rocketmq.autoconfigure; import org.dromara.dynamictp.adapter.rocketmq.RocketMqDtpAdapter; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/starter/starter-adapter/starter-adapter-sofa/pom.xml b/starter/starter-adapter/starter-adapter-sofa/pom.xml index 8bd5ca172c0e418a0b3d5677f68169c0a45b3ddb..10dd1c51c4760d9b06adba6db3ae1602f1f93a2f 100644 --- a/starter/starter-adapter/starter-adapter-sofa/pom.xml +++ b/starter/starter-adapter/starter-adapter-sofa/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-adapter-sofa diff --git a/starter/starter-adapter/starter-adapter-sofa/src/main/java/org/dromara/dynamictp/starter/adapter/sofa/autoconfigure/SofaTpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-sofa/src/main/java/org/dromara/dynamictp/starter/adapter/sofa/autoconfigure/SofaTpAutoConfiguration.java index 193151a25ada36bab6ecb0cd70cf1f4c4abf2a34..a2fbf96e2aaa9ebf797c9d67ddab2edd0c71133e 100644 --- a/starter/starter-adapter/starter-adapter-sofa/src/main/java/org/dromara/dynamictp/starter/adapter/sofa/autoconfigure/SofaTpAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-sofa/src/main/java/org/dromara/dynamictp/starter/adapter/sofa/autoconfigure/SofaTpAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.adapter.sofa.autoconfigure; import org.dromara.dynamictp.adapter.sofa.SofaDtpAdapter; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/starter/starter-adapter/starter-adapter-tars/pom.xml b/starter/starter-adapter/starter-adapter-tars/pom.xml index 79ffe148d3716e2c50716dc551ef9e86eb347df5..c4edf182b95223730a0976044cf64d79fad39362 100644 --- a/starter/starter-adapter/starter-adapter-tars/pom.xml +++ b/starter/starter-adapter/starter-adapter-tars/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-adapter-tars diff --git a/starter/starter-adapter/starter-adapter-tars/src/main/java/org/dromara/dynamictp/starter/adapter/tars/autoconfigure/TarsTpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-tars/src/main/java/org/dromara/dynamictp/starter/adapter/tars/autoconfigure/TarsTpAutoConfiguration.java index 49fa26bc2b213b6ce3cc145bb3c6e2e331e63fe0..187fef76e2c625de643fcc3cd4c35f6c7272fbe0 100644 --- a/starter/starter-adapter/starter-adapter-tars/src/main/java/org/dromara/dynamictp/starter/adapter/tars/autoconfigure/TarsTpAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-tars/src/main/java/org/dromara/dynamictp/starter/adapter/tars/autoconfigure/TarsTpAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.adapter.tars.autoconfigure; import org.dromara.dynamictp.adapter.tars.TarsDtpAdapter; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/starter/starter-adapter/starter-adapter-thrift/pom.xml b/starter/starter-adapter/starter-adapter-thrift/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..445dc96984ad64a53d2b6fed39c62e00ed8a9a3e --- /dev/null +++ b/starter/starter-adapter/starter-adapter-thrift/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + org.dromara.dynamictp + dynamic-tp-starter-adapter + 1.2.1 + ../pom.xml + + dynamic-tp-spring-boot-starter-adapter-thrift + + + + org.dromara.dynamictp + dynamic-tp-spring-boot-starter-adapter-common + + + + org.dromara.dynamictp + dynamic-tp-adapter-thrift + + + diff --git a/starter/starter-adapter/starter-adapter-thrift/src/main/java/org/dromara/dynamictp/starter/adapter/thrift/autoconfigure/ThriftTpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-thrift/src/main/java/org/dromara/dynamictp/starter/adapter/thrift/autoconfigure/ThriftTpAutoConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..b2ec34bd951991b09952b40856cc398c673f78e2 --- /dev/null +++ b/starter/starter-adapter/starter-adapter-thrift/src/main/java/org/dromara/dynamictp/starter/adapter/thrift/autoconfigure/ThriftTpAutoConfiguration.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.starter.adapter.thrift.autoconfigure; + +import org.dromara.dynamictp.adapter.thrift.ThriftDtpAdapter; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * ThriftTpAutoConfiguration related + * + * @author devin + * @since 1.2.2 + */ +@Configuration +@ConditionalOnClass(name = "org.apache.thrift.server.TServer") +@ConditionalOnBean({DtpBaseBeanConfiguration.class}) +@AutoConfigureAfter({DtpBaseBeanConfiguration.class}) +@SuppressWarnings("all") +public class ThriftTpAutoConfiguration { + + @Bean + @ConditionalOnMissingBean + public ThriftDtpAdapter thriftDtpAdapter() { + return new ThriftDtpAdapter(); + } +} diff --git a/starter/starter-adapter/starter-adapter-thrift/src/main/resources/META-INF/spring.factories b/starter/starter-adapter/starter-adapter-thrift/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000000000000000000000000000000000..f1df61d01f5b320873417092eedfc23010e909e9 --- /dev/null +++ b/starter/starter-adapter/starter-adapter-thrift/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +org.dromara.dynamictp.starter.adapter.thrift.autoconfigure.ThriftTpAutoConfiguration diff --git a/starter/starter-adapter/starter-adapter-webserver/pom.xml b/starter/starter-adapter/starter-adapter-webserver/pom.xml index 859c6f40aba50e1032ea5bc596550915dffefe45..fe1940b40badc820fc7b4ec48dc2850f61480a99 100644 --- a/starter/starter-adapter/starter-adapter-webserver/pom.xml +++ b/starter/starter-adapter/starter-adapter-webserver/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-starter-adapter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-adapter-webserver diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/AbstractWebServerDtpAdapter.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/AbstractWebServerDtpAdapter.java index 3623759efad595669d92830804c678dfb238e15c..4af71ddd988b310769b4e0db0625d247087be510 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/AbstractWebServerDtpAdapter.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/AbstractWebServerDtpAdapter.java @@ -19,9 +19,10 @@ package org.dromara.dynamictp.starter.adapter.webserver; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; import org.dromara.dynamictp.core.converter.ExecutorConverter; +import org.dromara.dynamictp.spring.holder.SpringContextHolder; import org.springframework.boot.web.context.WebServerApplicationContext; import org.springframework.boot.web.context.WebServerInitializedEvent; import org.springframework.boot.web.server.WebServer; @@ -29,6 +30,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; +import java.util.Objects; import java.util.concurrent.Executor; /** @@ -37,8 +39,7 @@ import java.util.concurrent.Executor; * @author yanhom * @author dragon-zhang * @since 1.0.0 - */ -@Slf4j + */@Slf4j public abstract class AbstractWebServerDtpAdapter extends AbstractDtpAdapter implements ApplicationListener { @@ -46,12 +47,12 @@ public abstract class AbstractWebServerDtpAdapter extends Ab public void onApplicationEvent(ApplicationEvent event) { if (event instanceof WebServerInitializedEvent) { try { - DtpProperties dtpProperties = ApplicationContextHolder.getBean(DtpProperties.class); + DtpProperties dtpProperties = ContextManagerHelper.getBean(DtpProperties.class); initialize(); afterInitialize(); refresh(dtpProperties); } catch (Exception e) { - log.error("Init web server thread pool failed.", e); + log.error("DynamicTp adapter, {} init failed.", getTpName(), e); } } } @@ -59,13 +60,18 @@ public abstract class AbstractWebServerDtpAdapter extends Ab @Override protected void initialize() { super.initialize(); - if (executors.get(getTpName()) == null) { - ApplicationContext applicationContext = ApplicationContextHolder.getInstance(); - WebServer webServer = ((WebServerApplicationContext) applicationContext).getWebServer(); - doEnhance(webServer); - log.info("DynamicTp adapter, web server {} executor init end, executor: {}", - getTpName(), ExecutorConverter.toMainFields(executors.get(getTpName()))); + if (Objects.nonNull(executors.get(getTpName()))) { + return; + } + ApplicationContext applicationContext = SpringContextHolder.getInstance(); + WebServer webServer = ((WebServerApplicationContext) applicationContext).getWebServer(); + doEnhance(webServer); + if (Objects.isNull(executors.get(getTpName()))) { + return; } + log.info("DynamicTp adapter, {} init end, executor: {}.", + getTpName(), ExecutorConverter.toMainFields(executors.get(getTpName()))); + } protected String getTpName() { diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/WebServerTpAutoConfiguration.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/WebServerTpAutoConfiguration.java index cd587d42cde97e9af544e269d2c00c93dfd3d656..3c60c07a11bde5bf4884dcd483b7ad95a50caa1c 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/WebServerTpAutoConfiguration.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/WebServerTpAutoConfiguration.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.starter.adapter.webserver.autocconfigure; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.dromara.dynamictp.starter.adapter.webserver.autocconfigure.condition.ConditionalOnJettyWebServer; import org.dromara.dynamictp.starter.adapter.webserver.autocconfigure.condition.ConditionalOnTomcatWebServer; import org.dromara.dynamictp.starter.adapter.webserver.autocconfigure.condition.ConditionalOnUndertowWebServer; diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/condition/OnJettyWebServerCondition.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/condition/OnJettyWebServerCondition.java index 53a196d71185dcfed513fffb36d268dd10a11509..724951184f73dec504ff6cb8827931293a347751 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/condition/OnJettyWebServerCondition.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/condition/OnJettyWebServerCondition.java @@ -33,8 +33,10 @@ public class OnJettyWebServerCondition extends AnyNestedCondition { } @ConditionalOnBean(name = {"JettyServletWebServerFactory"}) - static class ServletWebServer { } + static class ServletWebServer { + } @ConditionalOnBean(name = {"JettyReactiveWebServerFactory"}) - static class ReactiveWebServer { } + static class ReactiveWebServer { + } } diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/condition/OnTomcatWebServerCondition.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/condition/OnTomcatWebServerCondition.java index cfba98841059d82c4078ae94f03c10753c007f7b..0de4ba907fac721c4424a027b7f666693fd9bef6 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/condition/OnTomcatWebServerCondition.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/condition/OnTomcatWebServerCondition.java @@ -33,8 +33,15 @@ public class OnTomcatWebServerCondition extends AnyNestedCondition { } @ConditionalOnBean(name = {"tomcatServletWebServerFactory"}) - static class ServletWebServer { } + static class ServletWebServer { + } @ConditionalOnBean(name = {"tomcatReactiveWebServerFactory"}) - static class ReactiveWebServer { } + static class ReactiveWebServer { + } + + @ConditionalOnBean(name = {"tomcatEmbeddedServletContainerFactory"}) + static class ServletWebServer1x { + } + } diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/condition/OnUndertowWebServerCondition.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/condition/OnUndertowWebServerCondition.java index 5abb711bcc74e89d4befd157eb6d37415cea7299..8fc6d65455378a18826c1dcc5f92b8ab7a99cf51 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/condition/OnUndertowWebServerCondition.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/autocconfigure/condition/OnUndertowWebServerCondition.java @@ -34,8 +34,10 @@ public class OnUndertowWebServerCondition extends AnyNestedCondition { } @ConditionalOnBean(name = {"undertowServletWebServerFactory"}) - static class ServletWebServer { } + static class ServletWebServer { + } @ConditionalOnBean(name = {"undertowReactiveWebServerFactory"}) - static class ReactiveWebServer { } + static class ReactiveWebServer { + } } diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/jetty/JettyDtpAdapter.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/jetty/JettyDtpAdapter.java index 22f249dbb4e33c50d83c9765af5bc5032245b669..6957f947d122080cc2378078b65fc51f4248cb68 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/jetty/JettyDtpAdapter.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/jetty/JettyDtpAdapter.java @@ -20,7 +20,7 @@ package org.dromara.dynamictp.starter.adapter.webserver.jetty; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.properties.DtpProperties; import org.dromara.dynamictp.common.util.ReflectionUtil; -import org.dromara.dynamictp.core.support.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import org.dromara.dynamictp.core.support.ExecutorWrapper; import org.dromara.dynamictp.starter.adapter.webserver.AbstractWebServerDtpAdapter; import org.eclipse.jetty.io.ManagedSelector; @@ -95,11 +95,7 @@ public class JettyDtpAdapter extends AbstractWebServerDtpAdapter { public void allowCoreThreadTimeOut(boolean value) { getTomcatExecutor().allowCoreThreadTimeOut(value); } - + + @Override + public void preStartAllCoreThreads() { + getTomcatExecutor().prestartAllCoreThreads(); + } + @Override public long getKeepAliveTime(TimeUnit unit) { return getTomcatExecutor().getKeepAliveTime(unit); diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/tomcat/TomcatExecutorProxy.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/tomcat/TomcatExecutorProxy.java index 4fbd824c547250ccfc284e9b85f16b2769d2b7a6..b623cdc3b23d82455e07b5fbf8e32295febb1bb9 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/tomcat/TomcatExecutorProxy.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/tomcat/TomcatExecutorProxy.java @@ -20,6 +20,7 @@ package org.dromara.dynamictp.starter.adapter.webserver.tomcat; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.threads.TaskQueue; import org.apache.tomcat.util.threads.ThreadPoolExecutor; +import org.dromara.dynamictp.common.util.ExecutorUtil; import org.dromara.dynamictp.common.util.ReflectionUtil; import org.dromara.dynamictp.core.aware.AwareManager; import org.dromara.dynamictp.core.aware.RejectHandlerAware; @@ -53,6 +54,7 @@ public class TomcatExecutorProxy extends ThreadPoolExecutor implements TaskEnhan executor.getKeepAliveTime(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS, executor.getQueue(), executor.getThreadFactory()); setThreadRenewalDelay(executor.getThreadRenewalDelay()); + allowCoreThreadTimeOut(executor.allowsCoreThreadTimeOut()); Object handler = getRejectedExecutionHandler(executor); this.rejectHandlerType = handler.getClass().getSimpleName(); @@ -63,14 +65,10 @@ public class TomcatExecutorProxy extends ThreadPoolExecutor implements TaskEnhan new Class[]{RejectedExecutionHandler.class}, new RejectedInvocationHandler(handler))); } catch (Throwable t) { - try { - ReflectionUtil.setFieldValue("handler", this, Proxy - .newProxyInstance(handler.getClass().getClassLoader(), - new Class[]{java.util.concurrent.RejectedExecutionHandler.class}, - new RejectedInvocationHandler(handler))); - } catch (IllegalAccessException ex) { - throw new RuntimeException(ex); - } + ReflectionUtil.setFieldValue("handler", this, Proxy + .newProxyInstance(handler.getClass().getClassLoader(), + new Class[]{java.util.concurrent.RejectedExecutionHandler.class}, + new RejectedInvocationHandler(handler))); } if (executor.getQueue() instanceof TaskQueue) { ((TaskQueue) executor.getQueue()).setParent(this); @@ -86,14 +84,15 @@ public class TomcatExecutorProxy extends ThreadPoolExecutor implements TaskEnhan @Override protected void beforeExecute(Thread t, Runnable r) { - super.beforeExecute(t, r); AwareManager.beforeExecute(this, t, r); + super.beforeExecute(t, r); } @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); AwareManager.afterExecute(this, r, t); + ExecutorUtil.tryExecAfterExecute(r, t); } @Override diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/EnhancedQueueExecutorProxy.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/EnhancedQueueExecutorProxy.java index b0dcf9faabdd58d013988fda873027b46dae4532..3c7bd87242718820843b5217b69b2bb036f4b3e6 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/EnhancedQueueExecutorProxy.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/EnhancedQueueExecutorProxy.java @@ -50,19 +50,20 @@ public class EnhancedQueueExecutorProxy extends EnhancedQueueExecutor implements .setTerminationTask(executor.getTerminationTask()) .setRegisterMBean(true) .setMBeanName(executor.getMBeanName())); + allowCoreThreadTimeOut(executor.allowsCoreThreadTimeOut()); } @Override public void execute(Runnable runnable) { - Runnable enhancedTask = getEnhancedTask(EnhancedRunnable.of(runnable, this)); - AwareManager.execute(this, enhancedTask); + Runnable dtpRunnable = getEnhancedTask(runnable); + AwareManager.execute(this, dtpRunnable); try { - super.execute(enhancedTask); + super.execute(EnhancedRunnable.of(dtpRunnable, this)); } catch (Throwable e) { Throwable[] suppressedExceptions = e.getSuppressed(); for (Throwable t : suppressedExceptions) { if (t instanceof RejectedExecutionException) { - AwareManager.beforeReject(enhancedTask, this); + AwareManager.beforeReject(dtpRunnable, this); return; } } diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/UndertowDtpAdapter.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/UndertowDtpAdapter.java index 973e1c68983143e2904021ebf6be24d843c460f0..d2f6f6dea131de7453725b64ec00a4eab73e88c5 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/UndertowDtpAdapter.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/UndertowDtpAdapter.java @@ -64,12 +64,19 @@ public class UndertowDtpAdapter extends AbstractWebServerDtpAdapter XnioWorker xnioWorker = undertow.getWorker(); Object taskPool = ReflectionUtil.getFieldValue(XnioWorker.class, "taskPool", xnioWorker); if (Objects.isNull(taskPool)) { + log.warn("DynamicTp adapter, {} enhance failed, taskPool is null."); return; } + String tpName = getTpName(); val handler = TaskPoolHandlerFactory.getTaskPoolHandler(taskPool.getClass().getSimpleName()); + if (Objects.isNull(handler)) { + log.warn("DynamicTp adapter, {} enhance failed, unsupported TaskPool {}.", + getTpName(), taskPool.getClass().getSimpleName()); + return; + } String internalExecutor = handler.taskPoolType().getInternalExecutor(); Object executor = ReflectionUtil.getFieldValue(taskPool.getClass(), internalExecutor, taskPool); - String tpName = getTpName(); + if (executor instanceof ThreadPoolExecutor) { enhanceOriginExecutor(tpName, (ThreadPoolExecutor) executor, internalExecutor, taskPool); } else if (executor instanceof EnhancedQueueExecutor) { @@ -78,8 +85,8 @@ public class UndertowDtpAdapter extends AbstractWebServerDtpAdapter ReflectionUtil.setFieldValue(internalExecutor, taskPool, proxy); putAndFinalize(tpName, (ExecutorService) executor, new EnhancedQueueExecutorAdapter(proxy)); } catch (Throwable t) { - log.error("DynamicTp adapter, enhance {} failed, please adjust the order of the two dependencies" + - "(starter-undertow and starter-adapter-webserver) and try again.", tpName, t); + log.warn("DynamicTp adapter, {} enhance failed, please adjust the order of the two dependencies" + + "(spring-boot-starter-undertow and starter-adapter-webserver) and try again.", tpName, t); executors.put(tpName, new ExecutorWrapper(tpName, handler.adapt(executor))); } } else { diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/EnhancedQueueExecutorTaskPoolAdapter.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/EnhancedQueueExecutorTaskPoolAdapter.java index 33266ca13a4ebf04c8bca8e0b35e1fe99f1b1fbc..33b0ce646c94ad14d02d66d3a423264ee1e9e1f9 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/EnhancedQueueExecutorTaskPoolAdapter.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/EnhancedQueueExecutorTaskPoolAdapter.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.starter.adapter.webserver.undertow.taskpool; -import org.dromara.dynamictp.core.support.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import org.dromara.dynamictp.starter.adapter.webserver.undertow.UndertowTaskPoolEnum; import org.jboss.threads.EnhancedQueueExecutor; @@ -132,6 +132,11 @@ public class EnhancedQueueExecutorTaskPoolAdapter implements TaskPoolAdapter { this.executor.allowCoreThreadTimeOut(value); } + @Override + public void preStartAllCoreThreads() { + this.executor.prestartAllCoreThreads(); + } + @Override public long getKeepAliveTime(TimeUnit unit) { return this.executor.getKeepAliveTime().getSeconds(); diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/ExecutorServiceTaskPoolAdapter.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/ExecutorServiceTaskPoolAdapter.java index fe0071440c4ca5df3cb26c77ce66606bfb3eeff2..2bcedbc9e0382faa26ed0927338599fea9113f1c 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/ExecutorServiceTaskPoolAdapter.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/ExecutorServiceTaskPoolAdapter.java @@ -18,8 +18,8 @@ package org.dromara.dynamictp.starter.adapter.webserver.undertow.taskpool; import org.dromara.dynamictp.starter.adapter.webserver.undertow.UndertowTaskPoolEnum; -import org.dromara.dynamictp.core.support.ExecutorAdapter; -import org.dromara.dynamictp.core.support.ThreadPoolExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ThreadPoolExecutorAdapter; import java.util.concurrent.ThreadPoolExecutor; diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/ExternalTaskPoolAdapter.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/ExternalTaskPoolAdapter.java index 813ccdcd3670f1d89d423952d17786752cd23ac8..ff7ceb949a7e5885204c13a3a7e8dd330bc0fa84 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/ExternalTaskPoolAdapter.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/ExternalTaskPoolAdapter.java @@ -20,7 +20,7 @@ package org.dromara.dynamictp.starter.adapter.webserver.undertow.taskpool; import org.dromara.dynamictp.starter.adapter.webserver.undertow.TaskPoolHandlerFactory; import org.dromara.dynamictp.starter.adapter.webserver.undertow.UndertowTaskPoolEnum; import org.dromara.dynamictp.common.util.ReflectionUtil; -import org.dromara.dynamictp.core.support.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import lombok.val; /** diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/TaskPoolAdapter.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/TaskPoolAdapter.java index f2d4a8f7f2822a68e8c768526b0c043c52c8a990..0daa05ad75f2098c001319c8c933f28694d170ed 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/TaskPoolAdapter.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/TaskPoolAdapter.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.adapter.webserver.undertow.taskpool; import org.dromara.dynamictp.starter.adapter.webserver.undertow.UndertowTaskPoolEnum; -import org.dromara.dynamictp.core.support.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import java.util.concurrent.Executor; diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/ThreadPoolExecutorTaskPoolAdapter.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/ThreadPoolExecutorTaskPoolAdapter.java index b3bc10f57b57b801ac8f32bdc0d67e3996a9c8bd..6d28dde27930a7afcd2396e6dcf9f05dd56be3f6 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/ThreadPoolExecutorTaskPoolAdapter.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/taskpool/ThreadPoolExecutorTaskPoolAdapter.java @@ -18,8 +18,8 @@ package org.dromara.dynamictp.starter.adapter.webserver.undertow.taskpool; import org.dromara.dynamictp.starter.adapter.webserver.undertow.UndertowTaskPoolEnum; -import org.dromara.dynamictp.core.support.ExecutorAdapter; -import org.dromara.dynamictp.core.support.ThreadPoolExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ThreadPoolExecutorAdapter; import java.util.concurrent.ThreadPoolExecutor; diff --git a/starter/starter-common/pom.xml b/starter/starter-common/pom.xml index ed5dbc98025068e5953cec1340d7a978806fca9f..363c4e1258e4f119ab9bb5e77266954ad3da241c 100644 --- a/starter/starter-common/pom.xml +++ b/starter/starter-common/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-starter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-common @@ -31,5 +31,10 @@ org.springframework.boot spring-boot-starter-actuator + + + org.dromara.dynamictp + dynamic-tp-spring + \ No newline at end of file diff --git a/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/DtpBootBeanConfiguration.java b/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/DtpBootBeanConfiguration.java index 5adbdcf52633939858aaa231dbf7585fb957b230..ec66e4174f1f1dbb89adc666aada4976b2a42749 100644 --- a/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/DtpBootBeanConfiguration.java +++ b/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/DtpBootBeanConfiguration.java @@ -17,7 +17,7 @@ package org.dromara.dynamictp.starter.common; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.dromara.dynamictp.starter.common.monitor.DtpEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; import org.springframework.boot.autoconfigure.AutoConfigureAfter; diff --git a/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/binder/SpringBootPropertiesBinder.java b/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/binder/SpringBootPropertiesBinder.java index c5c2dc52c8c9b095892d0eabac38dec13220c539..b5c15a8af97bc6500a3d9848dcf4ec5d3d9a8f51 100644 --- a/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/binder/SpringBootPropertiesBinder.java +++ b/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/binder/SpringBootPropertiesBinder.java @@ -20,7 +20,8 @@ package org.dromara.dynamictp.starter.common.binder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.spring.PropertiesBinder; +import org.dromara.dynamictp.common.util.DtpPropertiesBinderUtil; +import org.dromara.dynamictp.core.support.binder.PropertiesBinder; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.PropertyValues; import org.springframework.boot.context.properties.bind.Bindable; @@ -44,27 +45,39 @@ import static org.dromara.dynamictp.common.constant.DynamicTpConst.MAIN_PROPERTI * @since 1.0.3 **/ @Slf4j -@SuppressWarnings("all") public class SpringBootPropertiesBinder implements PropertiesBinder { @Override public void bindDtpProperties(Map properties, DtpProperties dtpProperties) { + beforeBind(properties, dtpProperties); try { Class.forName("org.springframework.boot.context.properties.bind.Binder"); doBindIn2X(properties, dtpProperties); } catch (ClassNotFoundException e) { doBindIn1X(properties, dtpProperties); } + afterBind(properties, dtpProperties); } @Override - public void bindDtpProperties(Environment environment, DtpProperties dtpProperties) { + public void bindDtpProperties(Object environment, DtpProperties dtpProperties) { + if (!(environment instanceof Environment)) { + throw new IllegalArgumentException("Invalid environment type, expected org.springframework.core.env.Environment"); + } + Environment env = (Environment) environment; + beforeBind(env, dtpProperties); try { Class.forName("org.springframework.boot.context.properties.bind.Binder"); - doBindIn2X(environment, dtpProperties); + doBindIn2X(env, dtpProperties); } catch (ClassNotFoundException e) { - doBindIn1X(environment, dtpProperties); + doBindIn1X(env, dtpProperties); } + afterBind(environment, dtpProperties); + } + + @Override + public void afterBind(Object source, DtpProperties dtpProperties) { + DtpPropertiesBinderUtil.tryResetWithGlobalConfig(source, dtpProperties); } private void doBindIn2X(Map properties, DtpProperties dtpProperties) { @@ -115,4 +128,5 @@ public class SpringBootPropertiesBinder implements PropertiesBinder { throw new RuntimeException(e); } } + } diff --git a/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/initializer/DtpApplicationContextInitializer.java b/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/initializer/DtpApplicationContextInitializer.java index ed9b6645bf3f95052933cff559d306cb52218d57..bc9ae931d4df3ced24b3ebcc273ecfe5e982341a 100644 --- a/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/initializer/DtpApplicationContextInitializer.java +++ b/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/initializer/DtpApplicationContextInitializer.java @@ -31,6 +31,6 @@ public class DtpApplicationContextInitializer implements ApplicationContextIniti @Override public void initialize(ConfigurableApplicationContext applicationContext) { - DtpInitializerExecutor.init(); + DtpInitializerExecutor.init(applicationContext); } } diff --git a/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/monitor/DtpEndpoint.java b/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/monitor/DtpEndpoint.java index abfca8ce4ea31f8d8f9a956a8766f733d35c5438..c491dac2c127bee9b2e441d010f93c92dffcfb84 100644 --- a/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/monitor/DtpEndpoint.java +++ b/starter/starter-common/src/main/java/org/dromara/dynamictp/starter/common/monitor/DtpEndpoint.java @@ -21,11 +21,11 @@ import cn.hutool.core.io.FileUtil; import com.google.common.collect.Lists; import lombok.val; import org.apache.commons.collections4.MapUtils; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; import org.dromara.dynamictp.common.entity.JvmStats; import org.dromara.dynamictp.common.entity.Metrics; import org.dromara.dynamictp.core.DtpRegistry; import org.dromara.dynamictp.core.converter.ExecutorConverter; +import org.dromara.dynamictp.common.manager.ContextManagerHelper; import org.dromara.dynamictp.core.support.ExecutorWrapper; import org.dromara.dynamictp.core.aware.MetricsAware; import org.springframework.boot.actuate.endpoint.annotation.Endpoint; @@ -39,7 +39,7 @@ import java.util.List; * @author yanhom * @since 1.0.0 **/ -@Endpoint(id = "dynamic-tp") +@Endpoint(id = "dynamictp") public class DtpEndpoint { @ReadOperation @@ -51,7 +51,7 @@ public class DtpEndpoint { metricsList.add(ExecutorConverter.toMetrics(wrapper)); }); - val handlerMap = ApplicationContextHolder.getBeansOfType(MetricsAware.class); + val handlerMap = ContextManagerHelper.getBeansOfType(MetricsAware.class); if (MapUtils.isNotEmpty(handlerMap)) { handlerMap.forEach((k, v) -> metricsList.addAll(v.getMultiPoolStats())); } diff --git a/starter/starter-common/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/starter/starter-common/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 84dc5ef5ca78b765bb69e24a5a998951a00f8f59..cd5cc1f5ab64b9755a195492277017c661c20158 100644 --- a/starter/starter-common/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/starter/starter-common/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -1,466 +1,524 @@ { "groups": [ { - "name": "spring.dynamic.tp", + "name": "dynamictp", "type": "org.dromara.dynamictp.common.properties.DtpProperties", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.etcd", + "name": "dynamictp.etcd", "type": "org.dromara.dynamictp.common.properties.DtpProperties$Etcd", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.jetty-tp", + "name": "dynamictp.jetty-tp", "type": "org.dromara.dynamictp.common.entity.TpExecutorProps", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.tomcat-tp", + "name": "dynamictp.tomcat-tp", "type": "org.dromara.dynamictp.common.entity.TpExecutorProps", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.undertow-tp", + "name": "dynamictp.undertow-tp", "type": "org.dromara.dynamictp.common.entity.TpExecutorProps", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.zookeeper", + "name": "dynamictp.zookeeper", "type": "org.dromara.dynamictp.common.properties.DtpProperties$Zookeeper", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" } ], "properties": [ { - "name": "spring.dynamic.tp.brpc-tp", + "name": "dynamictp.brpc-tp", "type": "java.util.List", "description": "Brpc thread pools.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.collector-types", + "name": "dynamictp.collector-types", "type": "java.util.List", "description": "Metrics collector types, default is logging. see {@link CollectorTypeEnum}", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.config-type", + "name": "dynamictp.config-type", "type": "java.lang.String", "description": "Config file type, for zookeeper and etcd.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.dubbo-tp", + "name": "dynamictp.dubbo-tp", "type": "java.util.List", "description": "Dubbo thread pools.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.enabled", + "name": "dynamictp.enabled", "type": "java.lang.Boolean", "description": "If enabled DynamicTp.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties", "defaultValue": true }, { - "name": "spring.dynamic.tp.enabled-banner", + "name": "dynamictp.enabled-banner", "type": "java.lang.Boolean", "description": "If print banner.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties", "defaultValue": true }, { - "name": "spring.dynamic.tp.enabled-collect", + "name": "dynamictp.enabled-collect", "type": "java.lang.Boolean", "description": "If enabled metrics collect.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties", "defaultValue": true }, { - "name": "spring.dynamic.tp.etcd.auth-enable", + "name": "dynamictp.etcd.auth-enable", "type": "java.lang.Boolean", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties$Etcd", "defaultValue": false }, { - "name": "spring.dynamic.tp.etcd.authority", + "name": "dynamictp.etcd.authority", "type": "java.lang.String", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties$Etcd", "defaultValue": "ssl" }, { - "name": "spring.dynamic.tp.etcd.charset", + "name": "dynamictp.etcd.charset", "type": "java.lang.String", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties$Etcd", "defaultValue": "UTF-8" }, { - "name": "spring.dynamic.tp.etcd.endpoints", + "name": "dynamictp.etcd.endpoints", "type": "java.lang.String", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties$Etcd" }, { - "name": "spring.dynamic.tp.etcd.key", + "name": "dynamictp.etcd.key", "type": "java.lang.String", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties$Etcd" }, { - "name": "spring.dynamic.tp.etcd.password", + "name": "dynamictp.etcd.password", "type": "java.lang.String", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties$Etcd" }, { - "name": "spring.dynamic.tp.etcd.user", + "name": "dynamictp.etcd.user", "type": "java.lang.String", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties$Etcd" }, { - "name": "spring.dynamic.tp.executors", + "name": "dynamictp.executors", "type": "java.util.List", "description": "ThreadPoolExecutor configs.", "sourceType": "org.dromara.dynamictp.common.entity.DtpExecutorProps" }, { - "name": "spring.dynamic.tp.grpc-tp", + "name": "dynamictp.grpc-tp", "type": "java.util.List", "description": "Grpc thread pools.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.hystrix-tp", + "name": "dynamictp.hystrix-tp", "type": "java.util.List", "description": "Hystrix thread pools.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.jetty-tp.aware-names", + "name": "dynamictp.jetty-tp.aware-names", "type": "java.util.List", "description": "Aware names.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.jetty-tp.core-pool-size", + "name": "dynamictp.jetty-tp.core-pool-size", "type": "java.lang.Integer", "description": "CoreSize of ThreadPool.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": 1 }, { - "name": "spring.dynamic.tp.jetty-tp.keep-alive-time", + "name": "dynamictp.jetty-tp.keep-alive-time", "type": "java.lang.Long", "description": "When the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": 60 }, { - "name": "spring.dynamic.tp.jetty-tp.maximum-pool-size", + "name": "dynamictp.jetty-tp.maximum-pool-size", "type": "java.lang.Integer", "description": "MaxSize of ThreadPool.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.jetty-tp.notify-enabled", + "name": "dynamictp.jetty-tp.notify-enabled", "type": "java.lang.Boolean", "description": "If enable notify.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": true }, { - "name": "spring.dynamic.tp.jetty-tp.notify-items", + "name": "dynamictp.jetty-tp.notify-items", "type": "java.util.List", "description": "Notify items, see {@link NotifyItemEnum}", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.jetty-tp.platform-ids", + "name": "dynamictp.jetty-tp.platform-ids", "type": "java.util.List", "description": "Notify platform id", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.jetty-tp.queue-timeout", + "name": "dynamictp.jetty-tp.queue-timeout", "type": "java.lang.Long", "description": "Task queue wait timeout, unit (ms), just for statistics.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": 0 }, { - "name": "spring.dynamic.tp.jetty-tp.run-timeout", + "name": "dynamictp.jetty-tp.run-timeout", "type": "java.lang.Long", "description": "Task execute timeout, unit (ms), just for statistics.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": 0 }, { - "name": "spring.dynamic.tp.jetty-tp.task-wrapper-names", + "name": "dynamictp.jetty-tp.task-wrapper-names", "type": "java.util.Set", "description": "Task wrapper names.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.jetty-tp.thread-pool-alias-name", + "name": "dynamictp.jetty-tp.thread-pool-alias-name", "type": "java.lang.String", "description": "Simple Alias Name of ThreadPool. Use for notify.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.jetty-tp.thread-pool-name", + "name": "dynamictp.jetty-tp.thread-pool-name", "type": "java.lang.String", "description": "Name of ThreadPool.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.jetty-tp.unit", + "name": "dynamictp.jetty-tp.unit", "type": "java.util.concurrent.TimeUnit", "description": "Timeout unit.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.log-path", + "name": "dynamictp.log-path", "type": "java.lang.String", "description": "Metrics log storage path, just for \"logging\" type.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.monitor-interval", + "name": "dynamictp.monitor-interval", "type": "java.lang.Integer", "description": "Monitor interval, time unit(s)", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties", "defaultValue": 5 }, { - "name": "spring.dynamic.tp.motan-tp", + "name": "dynamictp.motan-tp", "type": "java.util.List", "description": "Motan server thread pools.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.okhttp3-tp", + "name": "dynamictp.okhttp3-tp", "type": "java.util.List", "description": "Okhttp3 thread pools.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.platforms", + "name": "dynamictp.platforms", "type": "java.util.List", "description": "Notify platform configs.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.rabbitmq-tp", + "name": "dynamictp.rabbitmq-tp", "type": "java.util.List", "description": "Rabbitmq thread pools.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.rocket-mq-tp", + "name": "dynamictp.rocket-mq-tp", "type": "java.util.List", "description": "RocketMq thread pools.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.sofa-tp", + "name": "dynamictp.sofa-tp", "type": "java.util.List", "description": "Sofa thread pools.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.tars-tp", + "name": "dynamictp.tars-tp", "type": "java.util.List", "description": "Tars thread pools.", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" }, { - "name": "spring.dynamic.tp.tomcat-tp.aware-names", + "name": "dynamictp.tomcat-tp.aware-names", "type": "java.util.List", "description": "Aware names.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.tomcat-tp.core-pool-size", + "name": "dynamictp.tomcat-tp.core-pool-size", "type": "java.lang.Integer", "description": "CoreSize of ThreadPool.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": 1 }, { - "name": "spring.dynamic.tp.tomcat-tp.keep-alive-time", + "name": "dynamictp.tomcat-tp.keep-alive-time", "type": "java.lang.Long", "description": "When the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": 60 }, { - "name": "spring.dynamic.tp.tomcat-tp.maximum-pool-size", + "name": "dynamictp.tomcat-tp.maximum-pool-size", "type": "java.lang.Integer", "description": "MaxSize of ThreadPool.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.tomcat-tp.notify-enabled", + "name": "dynamictp.tomcat-tp.notify-enabled", "type": "java.lang.Boolean", "description": "If enable notify.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": true }, { - "name": "spring.dynamic.tp.tomcat-tp.notify-items", + "name": "dynamictp.tomcat-tp.notify-items", "type": "java.util.List", "description": "Notify items, see {@link NotifyItemEnum}", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.tomcat-tp.platform-ids", + "name": "dynamictp.tomcat-tp.platform-ids", "type": "java.util.List", "description": "Notify platform id", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.tomcat-tp.queue-timeout", + "name": "dynamictp.tomcat-tp.queue-timeout", "type": "java.lang.Long", "description": "Task queue wait timeout, unit (ms), just for statistics.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": 0 }, { - "name": "spring.dynamic.tp.tomcat-tp.run-timeout", + "name": "dynamictp.tomcat-tp.run-timeout", "type": "java.lang.Long", "description": "Task execute timeout, unit (ms), just for statistics.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": 0 }, { - "name": "spring.dynamic.tp.tomcat-tp.task-wrapper-names", + "name": "dynamictp.tomcat-tp.task-wrapper-names", "type": "java.util.Set", "description": "Task wrapper names.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.tomcat-tp.thread-pool-alias-name", + "name": "dynamictp.tomcat-tp.thread-pool-alias-name", "type": "java.lang.String", "description": "Simple Alias Name of ThreadPool. Use for notify.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.tomcat-tp.thread-pool-name", + "name": "dynamictp.tomcat-tp.thread-pool-name", "type": "java.lang.String", "description": "Name of ThreadPool.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.tomcat-tp.unit", + "name": "dynamictp.tomcat-tp.unit", "type": "java.util.concurrent.TimeUnit", "description": "Timeout unit.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.undertow-tp.aware-names", + "name": "dynamictp.undertow-tp.aware-names", "type": "java.util.List", "description": "Aware names.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.undertow-tp.core-pool-size", + "name": "dynamictp.undertow-tp.core-pool-size", "type": "java.lang.Integer", "description": "CoreSize of ThreadPool.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": 1 }, { - "name": "spring.dynamic.tp.undertow-tp.keep-alive-time", + "name": "dynamictp.undertow-tp.keep-alive-time", "type": "java.lang.Long", "description": "When the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": 60 }, { - "name": "spring.dynamic.tp.undertow-tp.maximum-pool-size", + "name": "dynamictp.undertow-tp.maximum-pool-size", "type": "java.lang.Integer", "description": "MaxSize of ThreadPool.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.undertow-tp.notify-enabled", + "name": "dynamictp.undertow-tp.notify-enabled", "type": "java.lang.Boolean", "description": "If enable notify.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": true }, { - "name": "spring.dynamic.tp.undertow-tp.notify-items", + "name": "dynamictp.undertow-tp.notify-items", "type": "java.util.List", "description": "Notify items, see {@link NotifyItemEnum}", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.undertow-tp.platform-ids", + "name": "dynamictp.undertow-tp.platform-ids", "type": "java.util.List", "description": "Notify platform id", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.undertow-tp.queue-timeout", + "name": "dynamictp.undertow-tp.queue-timeout", "type": "java.lang.Long", "description": "Task queue wait timeout, unit (ms), just for statistics.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": 0 }, { - "name": "spring.dynamic.tp.undertow-tp.run-timeout", + "name": "dynamictp.undertow-tp.run-timeout", "type": "java.lang.Long", "description": "Task execute timeout, unit (ms), just for statistics.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps", "defaultValue": 0 }, { - "name": "spring.dynamic.tp.undertow-tp.task-wrapper-names", + "name": "dynamictp.undertow-tp.task-wrapper-names", "type": "java.util.Set", "description": "Task wrapper names.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.undertow-tp.thread-pool-alias-name", + "name": "dynamictp.undertow-tp.thread-pool-alias-name", "type": "java.lang.String", "description": "Simple Alias Name of ThreadPool. Use for notify.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.undertow-tp.thread-pool-name", + "name": "dynamictp.undertow-tp.thread-pool-name", "type": "java.lang.String", "description": "Name of ThreadPool.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.undertow-tp.unit", + "name": "dynamictp.undertow-tp.unit", "type": "java.util.concurrent.TimeUnit", "description": "Timeout unit.", "sourceType": "org.dromara.dynamictp.common.entity.TpExecutorProps" }, { - "name": "spring.dynamic.tp.zookeeper.config-key", + "name": "dynamictp.zookeeper.config-key", "type": "java.lang.String", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties$Zookeeper" }, { - "name": "spring.dynamic.tp.zookeeper.config-version", + "name": "dynamictp.zookeeper.config-version", "type": "java.lang.String", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties$Zookeeper" }, { - "name": "spring.dynamic.tp.zookeeper.node", + "name": "dynamictp.zookeeper.node", "type": "java.lang.String", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties$Zookeeper" }, { - "name": "spring.dynamic.tp.zookeeper.root-node", + "name": "dynamictp.zookeeper.root-node", "type": "java.lang.String", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties$Zookeeper" }, { - "name": "spring.dynamic.tp.zookeeper.zk-connect-str", + "name": "dynamictp.zookeeper.zk-connect-str", "type": "java.lang.String", "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties$Zookeeper" + }, + { + "name": "dynamictp.env", + "type": "java.lang.String", + "description": "Environment, if not set, will use \"spring.profiles.active\".", + "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" + }, + { + "name": "dynamictp.global-executor-props", + "type": "org.dromara.dynamictp.common.entity.DtpExecutorProps", + "description": "ThreadPoolExecutor global configs.", + "sourceType": "org.dromara.dynamictp.common.properties.DtpProperties" + }, + { + "name": "dynamictp.global-executor-props.executor-type", + "type": "java.lang.String", + "description": "ThreadPoolExecutor type, see {@link ExecutorType}", + "sourceType": "org.dromara.dynamictp.common.entity.DtpExecutorProps" + }, + { + "name": "dynamictp.global-executor-props.queue-type", + "type": "java.lang.String", + "description": "ThreadPoolExecutor queue type, see {@link QueueTypeEnum}", + "defaultValue": "VariableLinkedBlockingQueue", + "sourceType": "org.dromara.dynamictp.common.entity.DtpExecutorProps" + }, + { + "name": "dynamictp.global-executor-props.fair", + "type": "java.lang.Boolean", + "description": "ThreadPoolExecutor fair.", + "defaultValue": false, + "sourceType": "org.dromara.dynamictp.common.entity.DtpExecutorProps" + }, + { + "name": "dynamictp.global-executor-props.pre-start-all-core-threads", + "type": "java.lang.Boolean", + "description": "ThreadPoolExecutor pre start all core threads.", + "defaultValue": false, + "sourceType": "org.dromara.dynamictp.common.entity.DtpExecutorProps" + }, + { + "name": "dynamictp.global-executor-props.plugin-names", + "type": "java.util.Set", + "description": "ThreadPoolExecutor plugin names.", + "sourceType": "org.dromara.dynamictp.common.entity.DtpExecutorProps" + }, + { + "name": "dynamictp.global-executor-props.auto-create", + "type": "java.lang.Boolean", + "description": "ThreadPoolExecutor auto create.", + "defaultValue": true, + "sourceType": "org.dromara.dynamictp.common.entity.DtpExecutorProps" + }, + { + "name": "dynamictp.global-executor-props", + "type": "org.dromara.dynamictp.common.entity.DtpExecutorProps", + "description": "global executor configs.", + "sourceType": "org.dromara.dynamictp.common.entity.DtpExecutorProps" } ], "hints": [] diff --git a/starter/starter-common/src/main/resources/META-INF/services/org.dromara.dynamictp.core.spring.PropertiesBinder b/starter/starter-common/src/main/resources/META-INF/services/org.dromara.dynamictp.core.support.binder.PropertiesBinder similarity index 100% rename from starter/starter-common/src/main/resources/META-INF/services/org.dromara.dynamictp.core.spring.PropertiesBinder rename to starter/starter-common/src/main/resources/META-INF/services/org.dromara.dynamictp.core.support.binder.PropertiesBinder diff --git a/starter/starter-configcenter/cloud-starter-consul/pom.xml b/starter/starter-configcenter/cloud-starter-consul/pom.xml index 4c3782df5cfbcd3f6656dbd995b2d01d1864f31e..351885f02f119357ea03aefab0bf88565e9b4f72 100644 --- a/starter/starter-configcenter/cloud-starter-consul/pom.xml +++ b/starter/starter-configcenter/cloud-starter-consul/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-starter-configcenter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-cloud-starter-consul diff --git a/starter/starter-configcenter/cloud-starter-consul/src/main/java/org/dromara/dynamictp/starter/cloud/consul/autoconfigure/DtpConsulAutoConfiguration.java b/starter/starter-configcenter/cloud-starter-consul/src/main/java/org/dromara/dynamictp/starter/cloud/consul/autoconfigure/DtpConsulAutoConfiguration.java index 190572fb8255cf656eda3a7ab5ed656d0a7c8d2b..6ae2b305c74d78e060361ce43bdcb069fc1eba6a 100644 --- a/starter/starter-configcenter/cloud-starter-consul/src/main/java/org/dromara/dynamictp/starter/cloud/consul/autoconfigure/DtpConsulAutoConfiguration.java +++ b/starter/starter-configcenter/cloud-starter-consul/src/main/java/org/dromara/dynamictp/starter/cloud/consul/autoconfigure/DtpConsulAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.cloud.consul.autoconfigure; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.dromara.dynamictp.starter.cloud.consul.refresher.CloudConsulRefresher; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; diff --git a/starter/starter-configcenter/cloud-starter-consul/src/main/java/org/dromara/dynamictp/starter/cloud/consul/refresher/CloudConsulRefresher.java b/starter/starter-configcenter/cloud-starter-consul/src/main/java/org/dromara/dynamictp/starter/cloud/consul/refresher/CloudConsulRefresher.java index 31edd80de0841220a042c7e3a6afd6912b80f9b2..0721efc39fd2bf9d8d7aeb2422ad125a576a0a17 100644 --- a/starter/starter-configcenter/cloud-starter-consul/src/main/java/org/dromara/dynamictp/starter/cloud/consul/refresher/CloudConsulRefresher.java +++ b/starter/starter-configcenter/cloud-starter-consul/src/main/java/org/dromara/dynamictp/starter/cloud/consul/refresher/CloudConsulRefresher.java @@ -19,7 +19,7 @@ package org.dromara.dynamictp.starter.cloud.consul.refresher; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.refresher.AbstractRefresher; +import org.dromara.dynamictp.spring.AbstractSpringRefresher; import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.SmartApplicationListener; @@ -29,7 +29,7 @@ import org.springframework.lang.NonNull; * @author Redick01 */ @Slf4j -public class CloudConsulRefresher extends AbstractRefresher implements SmartApplicationListener { +public class CloudConsulRefresher extends AbstractSpringRefresher implements SmartApplicationListener { public CloudConsulRefresher(DtpProperties dtpProperties) { super(dtpProperties); diff --git a/starter/starter-configcenter/cloud-starter-huawei/pom.xml b/starter/starter-configcenter/cloud-starter-huawei/pom.xml index 2ad077cda8872a76210fac88eb79dc7446bdaa09..486f762e4a0a40432111d5c517da1c0e3471b062 100644 --- a/starter/starter-configcenter/cloud-starter-huawei/pom.xml +++ b/starter/starter-configcenter/cloud-starter-huawei/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-starter-configcenter - ${revision} + 1.2.1 ../pom.xml diff --git a/starter/starter-configcenter/cloud-starter-huawei/src/main/java/org/dromara/dynamictp/starter/cloud/huawei/autoconfigure/DtpHuaweiAutoConfiguration.java b/starter/starter-configcenter/cloud-starter-huawei/src/main/java/org/dromara/dynamictp/starter/cloud/huawei/autoconfigure/DtpHuaweiAutoConfiguration.java index c6f451953803010de418bc58ff05a67c932789f7..5d4f7702b43ab41c5a60cce57c2a2d9dc42a4b98 100644 --- a/starter/starter-configcenter/cloud-starter-huawei/src/main/java/org/dromara/dynamictp/starter/cloud/huawei/autoconfigure/DtpHuaweiAutoConfiguration.java +++ b/starter/starter-configcenter/cloud-starter-huawei/src/main/java/org/dromara/dynamictp/starter/cloud/huawei/autoconfigure/DtpHuaweiAutoConfiguration.java @@ -19,7 +19,7 @@ package org.dromara.dynamictp.starter.cloud.huawei.autoconfigure; import com.huaweicloud.common.configration.bootstrap.ConfigBootstrapProperties; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.dromara.dynamictp.starter.cloud.huawei.refresher.CloudHuaweiRefresher; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; diff --git a/starter/starter-configcenter/cloud-starter-huawei/src/main/java/org/dromara/dynamictp/starter/cloud/huawei/refresher/CloudHuaweiRefresher.java b/starter/starter-configcenter/cloud-starter-huawei/src/main/java/org/dromara/dynamictp/starter/cloud/huawei/refresher/CloudHuaweiRefresher.java index 3e637c68de29edad45f0297ebff271bccc2871bd..eeaca9e928cc03fbb560df7c0cded53dc11a9874 100644 --- a/starter/starter-configcenter/cloud-starter-huawei/src/main/java/org/dromara/dynamictp/starter/cloud/huawei/refresher/CloudHuaweiRefresher.java +++ b/starter/starter-configcenter/cloud-starter-huawei/src/main/java/org/dromara/dynamictp/starter/cloud/huawei/refresher/CloudHuaweiRefresher.java @@ -19,7 +19,7 @@ package org.dromara.dynamictp.starter.cloud.huawei.refresher; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.refresher.AbstractRefresher; +import org.dromara.dynamictp.spring.AbstractSpringRefresher; import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.SmartApplicationListener; @@ -29,7 +29,7 @@ import org.springframework.lang.NonNull; * @author windsearcher */ @Slf4j -public class CloudHuaweiRefresher extends AbstractRefresher implements SmartApplicationListener { +public class CloudHuaweiRefresher extends AbstractSpringRefresher implements SmartApplicationListener { public CloudHuaweiRefresher(DtpProperties dtpProperties) { super(dtpProperties); diff --git a/starter/starter-configcenter/cloud-starter-nacos/pom.xml b/starter/starter-configcenter/cloud-starter-nacos/pom.xml index 035de2112faf9723736a4a718692760b6bbcde56..6e1257208b54b9ba2091fb508b19540ebffca6b5 100644 --- a/starter/starter-configcenter/cloud-starter-nacos/pom.xml +++ b/starter/starter-configcenter/cloud-starter-nacos/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter-configcenter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-cloud-starter-nacos diff --git a/starter/starter-configcenter/cloud-starter-nacos/src/main/java/org/dromara/dynamictp/starter/cloud/nacos/autoconfigure/DtpCloudNacosAutoConfiguration.java b/starter/starter-configcenter/cloud-starter-nacos/src/main/java/org/dromara/dynamictp/starter/cloud/nacos/autoconfigure/DtpCloudNacosAutoConfiguration.java index 23b45a3b2f9da1c628950556774cb4b594986bcf..9a67ceef946e77c6f6e8bad6e748fec85ff8dfb1 100644 --- a/starter/starter-configcenter/cloud-starter-nacos/src/main/java/org/dromara/dynamictp/starter/cloud/nacos/autoconfigure/DtpCloudNacosAutoConfiguration.java +++ b/starter/starter-configcenter/cloud-starter-nacos/src/main/java/org/dromara/dynamictp/starter/cloud/nacos/autoconfigure/DtpCloudNacosAutoConfiguration.java @@ -20,7 +20,7 @@ package org.dromara.dynamictp.starter.cloud.nacos.autoconfigure; import com.alibaba.cloud.nacos.NacosConfigManager; import com.alibaba.cloud.nacos.NacosConfigProperties; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.dromara.dynamictp.starter.cloud.nacos.refresher.CloudNacosRefresher; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; diff --git a/starter/starter-configcenter/cloud-starter-nacos/src/main/java/org/dromara/dynamictp/starter/cloud/nacos/refresher/CloudNacosRefresher.java b/starter/starter-configcenter/cloud-starter-nacos/src/main/java/org/dromara/dynamictp/starter/cloud/nacos/refresher/CloudNacosRefresher.java index 8da6c6e0350122bcf95c21635b45228d2b6ce5ef..555e2fc0682ff82a36af2da0866007709f4aa910 100644 --- a/starter/starter-configcenter/cloud-starter-nacos/src/main/java/org/dromara/dynamictp/starter/cloud/nacos/refresher/CloudNacosRefresher.java +++ b/starter/starter-configcenter/cloud-starter-nacos/src/main/java/org/dromara/dynamictp/starter/cloud/nacos/refresher/CloudNacosRefresher.java @@ -19,7 +19,7 @@ package org.dromara.dynamictp.starter.cloud.nacos.refresher; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.refresher.AbstractRefresher; +import org.dromara.dynamictp.spring.AbstractSpringRefresher; import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.SmartApplicationListener; @@ -32,7 +32,7 @@ import org.springframework.lang.NonNull; * @since 1.0.0 **/ @Slf4j -public class CloudNacosRefresher extends AbstractRefresher implements SmartApplicationListener { +public class CloudNacosRefresher extends AbstractSpringRefresher implements SmartApplicationListener { public CloudNacosRefresher(DtpProperties dtpProperties) { super(dtpProperties); diff --git a/starter/starter-configcenter/cloud-starter-polaris/pom.xml b/starter/starter-configcenter/cloud-starter-polaris/pom.xml index dba6b76c89455fef624cfe9e1def2b307fe3baef..6addfedf9077d08123bfd8747288b4dbeb163c5c 100644 --- a/starter/starter-configcenter/cloud-starter-polaris/pom.xml +++ b/starter/starter-configcenter/cloud-starter-polaris/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter-configcenter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-cloud-starter-polaris diff --git a/starter/starter-configcenter/cloud-starter-polaris/src/main/java/org/dromara/dynamictp/starter/cloud/polaris/autoconfigure/DtpPolarisAutoConfiguration.java b/starter/starter-configcenter/cloud-starter-polaris/src/main/java/org/dromara/dynamictp/starter/cloud/polaris/autoconfigure/DtpPolarisAutoConfiguration.java index f1b3ed98e29c26b5f00de9089b100ba7d8c2ef92..d81c6f5bcdb116b3ca2dcc8ce56a8ac533ab48aa 100644 --- a/starter/starter-configcenter/cloud-starter-polaris/src/main/java/org/dromara/dynamictp/starter/cloud/polaris/autoconfigure/DtpPolarisAutoConfiguration.java +++ b/starter/starter-configcenter/cloud-starter-polaris/src/main/java/org/dromara/dynamictp/starter/cloud/polaris/autoconfigure/DtpPolarisAutoConfiguration.java @@ -19,7 +19,7 @@ package org.dromara.dynamictp.starter.cloud.polaris.autoconfigure; import com.tencent.cloud.polaris.config.config.PolarisConfigProperties; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.dromara.dynamictp.starter.cloud.polaris.refresher.CloudPolarisRefresher; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; diff --git a/starter/starter-configcenter/cloud-starter-polaris/src/main/java/org/dromara/dynamictp/starter/cloud/polaris/refresher/CloudPolarisRefresher.java b/starter/starter-configcenter/cloud-starter-polaris/src/main/java/org/dromara/dynamictp/starter/cloud/polaris/refresher/CloudPolarisRefresher.java index 3c6d1d9672c729298b03fadb4f6374e800cbe5da..713504ed4d203910d65ddcddedee0d0b61c4b5bd 100644 --- a/starter/starter-configcenter/cloud-starter-polaris/src/main/java/org/dromara/dynamictp/starter/cloud/polaris/refresher/CloudPolarisRefresher.java +++ b/starter/starter-configcenter/cloud-starter-polaris/src/main/java/org/dromara/dynamictp/starter/cloud/polaris/refresher/CloudPolarisRefresher.java @@ -19,7 +19,7 @@ package org.dromara.dynamictp.starter.cloud.polaris.refresher; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.refresher.AbstractRefresher; +import org.dromara.dynamictp.spring.AbstractSpringRefresher; import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.SmartApplicationListener; @@ -32,7 +32,7 @@ import org.springframework.lang.NonNull; * @since 1.0.0 **/ @Slf4j -public class CloudPolarisRefresher extends AbstractRefresher implements SmartApplicationListener { +public class CloudPolarisRefresher extends AbstractSpringRefresher implements SmartApplicationListener { public CloudPolarisRefresher(DtpProperties dtpProperties) { super(dtpProperties); diff --git a/starter/starter-configcenter/cloud-starter-zookeeper/pom.xml b/starter/starter-configcenter/cloud-starter-zookeeper/pom.xml index 21cfda1e4d098187832c8d9bfd7cf53ebab86380..ff568d685c028d888088eab1a5da8bf3ec4764b9 100644 --- a/starter/starter-configcenter/cloud-starter-zookeeper/pom.xml +++ b/starter/starter-configcenter/cloud-starter-zookeeper/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-starter-configcenter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-cloud-starter-zookeeper diff --git a/starter/starter-configcenter/cloud-starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/cloud/zookeeper/autoconfigure/DtpCloudZkAutoConfiguration.java b/starter/starter-configcenter/cloud-starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/cloud/zookeeper/autoconfigure/DtpCloudZkAutoConfiguration.java index 5ced916418214be701d5f317d8d4df01d373d654..67576fabc97a7dee22bf7c8747a9fb30e2c2e5cb 100644 --- a/starter/starter-configcenter/cloud-starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/cloud/zookeeper/autoconfigure/DtpCloudZkAutoConfiguration.java +++ b/starter/starter-configcenter/cloud-starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/cloud/zookeeper/autoconfigure/DtpCloudZkAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.cloud.zookeeper.autoconfigure; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.dromara.dynamictp.starter.cloud.zookeeper.refresher.CloudZookeeperRefresher; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; diff --git a/starter/starter-configcenter/cloud-starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/cloud/zookeeper/refresher/CloudZookeeperRefresher.java b/starter/starter-configcenter/cloud-starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/cloud/zookeeper/refresher/CloudZookeeperRefresher.java index bb9e0e175432416feea44bf62e53e7110361f596..203ab54b543a791ea665aba5d6d3e1cc27b0a512 100644 --- a/starter/starter-configcenter/cloud-starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/cloud/zookeeper/refresher/CloudZookeeperRefresher.java +++ b/starter/starter-configcenter/cloud-starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/cloud/zookeeper/refresher/CloudZookeeperRefresher.java @@ -19,7 +19,7 @@ package org.dromara.dynamictp.starter.cloud.zookeeper.refresher; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.refresher.AbstractRefresher; +import org.dromara.dynamictp.spring.AbstractSpringRefresher; import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.SmartApplicationListener; @@ -29,7 +29,7 @@ import org.springframework.lang.NonNull; * @author Redick01 */ @Slf4j -public class CloudZookeeperRefresher extends AbstractRefresher implements SmartApplicationListener { +public class CloudZookeeperRefresher extends AbstractSpringRefresher implements SmartApplicationListener { public CloudZookeeperRefresher(DtpProperties dtpProperties) { super(dtpProperties); diff --git a/starter/starter-configcenter/pom.xml b/starter/starter-configcenter/pom.xml index 6ccbd2f9b1f90eb8e17f95345df52c1379bbfe35..5bdc79ac57ce5879eb64952ce4f78fb8271a84c5 100644 --- a/starter/starter-configcenter/pom.xml +++ b/starter/starter-configcenter/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter - ${revision} + 1.2.1 ../pom.xml diff --git a/starter/starter-configcenter/starter-apollo/pom.xml b/starter/starter-configcenter/starter-apollo/pom.xml index c20906e5ebbcbc2344a6cbbb2e3a9c7e79d12f34..c8e2b158f7acfbcd3368ba4db6602505d8131dc8 100644 --- a/starter/starter-configcenter/starter-apollo/pom.xml +++ b/starter/starter-configcenter/starter-apollo/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter-configcenter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-apollo diff --git a/starter/starter-configcenter/starter-apollo/src/main/java/org/dromara/dynamictp/starter/apollo/autoconfigure/DtpApolloAutoConfiguration.java b/starter/starter-configcenter/starter-apollo/src/main/java/org/dromara/dynamictp/starter/apollo/autoconfigure/DtpApolloAutoConfiguration.java index 563f4d8f4ee649640720859f84f69cf1d38fa900..91af3f8d08aeacb9bc6e1edbb1037c96bf29894a 100644 --- a/starter/starter-configcenter/starter-apollo/src/main/java/org/dromara/dynamictp/starter/apollo/autoconfigure/DtpApolloAutoConfiguration.java +++ b/starter/starter-configcenter/starter-apollo/src/main/java/org/dromara/dynamictp/starter/apollo/autoconfigure/DtpApolloAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.apollo.autoconfigure; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.dromara.dynamictp.starter.apollo.refresher.ApolloRefresher; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; diff --git a/starter/starter-configcenter/starter-apollo/src/main/java/org/dromara/dynamictp/starter/apollo/refresher/ApolloRefresher.java b/starter/starter-configcenter/starter-apollo/src/main/java/org/dromara/dynamictp/starter/apollo/refresher/ApolloRefresher.java index 934495d9bcf487aa77f59dfe8f0b62099d18ce94..78a8e40709617ad2ca3aa374ccd69f73fcac92e8 100644 --- a/starter/starter-configcenter/starter-apollo/src/main/java/org/dromara/dynamictp/starter/apollo/refresher/ApolloRefresher.java +++ b/starter/starter-configcenter/starter-apollo/src/main/java/org/dromara/dynamictp/starter/apollo/refresher/ApolloRefresher.java @@ -30,7 +30,7 @@ import lombok.val; import org.dromara.dynamictp.common.em.ConfigFileTypeEnum; import org.dromara.dynamictp.common.properties.DtpProperties; import org.dromara.dynamictp.core.handler.ConfigHandler; -import org.dromara.dynamictp.core.refresher.AbstractRefresher; +import org.dromara.dynamictp.spring.AbstractSpringRefresher; import org.springframework.beans.factory.InitializingBean; import java.io.IOException; @@ -46,7 +46,7 @@ import static org.dromara.dynamictp.common.constant.DynamicTpConst.MAIN_PROPERTI * @since 1.0.0 **/ @Slf4j -public class ApolloRefresher extends AbstractRefresher implements ConfigFileChangeListener, InitializingBean { +public class ApolloRefresher extends AbstractSpringRefresher implements ConfigFileChangeListener, InitializingBean { private static final Splitter NAMESPACE_SPLITTER = Splitter.on(",").omitEmptyStrings().trimResults(); diff --git a/starter/starter-configcenter/starter-etcd/pom.xml b/starter/starter-configcenter/starter-etcd/pom.xml index de05a1aaaa41ea6bb65a34456af700ecc866f155..ddee363fd1b64fd2538f156e796aff7ebfa61500 100644 --- a/starter/starter-configcenter/starter-etcd/pom.xml +++ b/starter/starter-configcenter/starter-etcd/pom.xml @@ -5,7 +5,7 @@ dynamic-tp-starter-configcenter org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml 4.0.0 diff --git a/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/autoconfigure/DtpEtcdAutoConfiguration.java b/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/autoconfigure/DtpEtcdAutoConfiguration.java index 426a53e9f14e5682a9904fd692353817711520e2..d3ab5940e3b81407e5037e07902fb3b8e3d688de 100644 --- a/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/autoconfigure/DtpEtcdAutoConfiguration.java +++ b/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/autoconfigure/DtpEtcdAutoConfiguration.java @@ -19,7 +19,7 @@ package org.dromara.dynamictp.starter.etcd.autoconfigure; import io.etcd.jetcd.Client; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.dromara.dynamictp.starter.etcd.refresher.EtcdRefresher; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; diff --git a/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/autoconfigure/EtcdConfigEnvironmentProcessor.java b/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/autoconfigure/EtcdConfigEnvironmentProcessor.java index b25cea3ec825a560f323285a17c887d76050d74f..321e4a9a439010abfb9f16c49dcf1dfd68ff296a 100644 --- a/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/autoconfigure/EtcdConfigEnvironmentProcessor.java +++ b/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/autoconfigure/EtcdConfigEnvironmentProcessor.java @@ -20,7 +20,7 @@ package org.dromara.dynamictp.starter.etcd.autoconfigure; import lombok.SneakyThrows; import lombok.val; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.support.BinderHelper; +import org.dromara.dynamictp.core.support.binder.BinderHelper; import org.dromara.dynamictp.starter.etcd.util.EtcdUtil; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; diff --git a/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/refresher/EtcdListener.java b/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/refresher/EtcdListener.java index ebcf8dcbb923e02ebc569d5c2ed222749c5e4740..d0a59725961d515d45403063b58e658423706cd4 100644 --- a/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/refresher/EtcdListener.java +++ b/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/refresher/EtcdListener.java @@ -24,7 +24,7 @@ import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.support.BinderHelper; +import org.dromara.dynamictp.core.support.binder.BinderHelper; import org.dromara.dynamictp.starter.etcd.util.EtcdUtil; /** diff --git a/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/refresher/EtcdRefresher.java b/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/refresher/EtcdRefresher.java index 1798b2ac60295e65f04277485e812d3608957c79..f1fd4d9dc2a515b85f3cf3b12062654f6d757bfd 100644 --- a/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/refresher/EtcdRefresher.java +++ b/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/refresher/EtcdRefresher.java @@ -19,8 +19,8 @@ package org.dromara.dynamictp.starter.etcd.refresher; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.refresher.AbstractRefresher; -import org.dromara.dynamictp.core.support.BinderHelper; +import org.dromara.dynamictp.core.support.binder.BinderHelper; +import org.dromara.dynamictp.spring.AbstractSpringRefresher; import org.dromara.dynamictp.starter.etcd.util.EtcdUtil; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; @@ -32,7 +32,7 @@ import java.util.Map; * @author Redick01 */ @Slf4j -public class EtcdRefresher extends AbstractRefresher implements InitializingBean, Ordered, DisposableBean { +public class EtcdRefresher extends AbstractSpringRefresher implements InitializingBean, Ordered, DisposableBean { public EtcdRefresher(DtpProperties dtpProperties) { super(dtpProperties); diff --git a/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/util/EtcdUtil.java b/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/util/EtcdUtil.java index 8d71b47849d6c9fcd306af2287c80d178dfd9329..2538e46769d8e1fdb2f9ba172c5bed238f0f46da 100644 --- a/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/util/EtcdUtil.java +++ b/starter/starter-configcenter/starter-etcd/src/main/java/org/dromara/dynamictp/starter/etcd/util/EtcdUtil.java @@ -39,6 +39,7 @@ import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.TimeUnit; /** * @author Redick01 @@ -97,7 +98,7 @@ public final class EtcdUtil { KeyValue keyValue = client(etcd) .getKVClient() .get(bytesOf(etcd.getKey())) - .get() + .get(etcd.getTimeout(), TimeUnit.MILLISECONDS) .getKvs() .get(0); if (Objects.isNull(keyValue)) { @@ -111,7 +112,7 @@ public final class EtcdUtil { GetResponse response = client(etcd) .getKVClient() .get(key, getOption) - .get(); + .get(etcd.getTimeout(), TimeUnit.MILLISECONDS); List keyValues = response.getKvs(); Map finalResultMap = resultMap; keyValues.forEach(keyValue -> { diff --git a/starter/starter-configcenter/starter-nacos/pom.xml b/starter/starter-configcenter/starter-nacos/pom.xml index 23eab1472e85b21868f3074f18cc4691908b762c..b45777150b8d50864ebdd4c581792eaf07b55b65 100644 --- a/starter/starter-configcenter/starter-nacos/pom.xml +++ b/starter/starter-configcenter/starter-nacos/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter-configcenter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-nacos diff --git a/starter/starter-configcenter/starter-nacos/src/main/java/org/dromara/dynamictp/starter/nacos/autoconfigure/DtpNacosAutoConfiguration.java b/starter/starter-configcenter/starter-nacos/src/main/java/org/dromara/dynamictp/starter/nacos/autoconfigure/DtpNacosAutoConfiguration.java index 541c9b699827f4d6784b00bd4d24ce59820cffcb..2b2f94a754bd05d5d2313325820b9e9d7e64f46f 100644 --- a/starter/starter-configcenter/starter-nacos/src/main/java/org/dromara/dynamictp/starter/nacos/autoconfigure/DtpNacosAutoConfiguration.java +++ b/starter/starter-configcenter/starter-nacos/src/main/java/org/dromara/dynamictp/starter/nacos/autoconfigure/DtpNacosAutoConfiguration.java @@ -19,7 +19,7 @@ package org.dromara.dynamictp.starter.nacos.autoconfigure; import org.dromara.dynamictp.common.properties.DtpProperties; import com.alibaba.boot.nacos.config.properties.NacosConfigProperties; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.dromara.dynamictp.starter.nacos.refresher.NacosRefresher; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; diff --git a/starter/starter-configcenter/starter-nacos/src/main/java/org/dromara/dynamictp/starter/nacos/refresher/NacosRefresher.java b/starter/starter-configcenter/starter-nacos/src/main/java/org/dromara/dynamictp/starter/nacos/refresher/NacosRefresher.java index aab757b80a26370e29aa561b650e6e44c07e2484..1bacb18446045b6e83c7b5ea969f551ab4d646d9 100644 --- a/starter/starter-configcenter/starter-nacos/src/main/java/org/dromara/dynamictp/starter/nacos/refresher/NacosRefresher.java +++ b/starter/starter-configcenter/starter-nacos/src/main/java/org/dromara/dynamictp/starter/nacos/refresher/NacosRefresher.java @@ -20,7 +20,7 @@ package org.dromara.dynamictp.starter.nacos.refresher; import com.alibaba.nacos.spring.context.event.config.NacosConfigEvent; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.refresher.AbstractRefresher; +import org.dromara.dynamictp.spring.AbstractSpringRefresher; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.SmartApplicationListener; @@ -31,7 +31,7 @@ import org.springframework.context.event.SmartApplicationListener; * @since 1.0.0 **/ @Slf4j -public class NacosRefresher extends AbstractRefresher implements SmartApplicationListener { +public class NacosRefresher extends AbstractSpringRefresher implements SmartApplicationListener { public NacosRefresher(DtpProperties dtpProperties) { super(dtpProperties); diff --git a/starter/starter-configcenter/starter-zookeeper/pom.xml b/starter/starter-configcenter/starter-zookeeper/pom.xml index fe28ec30f1ead7f00e28e49d32b915bd731d1dbf..5c985756179660e72150ce26bec218cbf7919b2f 100644 --- a/starter/starter-configcenter/starter-zookeeper/pom.xml +++ b/starter/starter-configcenter/starter-zookeeper/pom.xml @@ -6,7 +6,7 @@ org.dromara.dynamictp dynamic-tp-starter-configcenter - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-zookeeper @@ -27,5 +27,9 @@ + + org.dromara.dynamictp + dynamic-tp-spring + \ No newline at end of file diff --git a/starter/starter-configcenter/starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/zookeeper/autoconfigure/DtpZkAutoConfiguration.java b/starter/starter-configcenter/starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/zookeeper/autoconfigure/DtpZkAutoConfiguration.java index b5752fc4b0ec0249c73def0436ddb518887d0e2a..97df7e86bb577eaf9d472d8a4d88c67a6c38404d 100644 --- a/starter/starter-configcenter/starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/zookeeper/autoconfigure/DtpZkAutoConfiguration.java +++ b/starter/starter-configcenter/starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/zookeeper/autoconfigure/DtpZkAutoConfiguration.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.starter.zookeeper.autoconfigure; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; import org.dromara.dynamictp.starter.zookeeper.refresher.ZookeeperRefresher; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; diff --git a/starter/starter-configcenter/starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/zookeeper/autoconfigure/ZkConfigEnvironmentProcessor.java b/starter/starter-configcenter/starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/zookeeper/autoconfigure/ZkConfigEnvironmentProcessor.java index 345b2fed5ff9906669b7a9dd9849ae066a4b337f..3bdf793d0b79c1623e3aeb53d671e833221fb841 100644 --- a/starter/starter-configcenter/starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/zookeeper/autoconfigure/ZkConfigEnvironmentProcessor.java +++ b/starter/starter-configcenter/starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/zookeeper/autoconfigure/ZkConfigEnvironmentProcessor.java @@ -19,7 +19,7 @@ package org.dromara.dynamictp.starter.zookeeper.autoconfigure; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.support.BinderHelper; +import org.dromara.dynamictp.core.support.binder.BinderHelper; import org.dromara.dynamictp.starter.zookeeper.util.CuratorUtil; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; diff --git a/starter/starter-configcenter/starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/zookeeper/refresher/ZookeeperRefresher.java b/starter/starter-configcenter/starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/zookeeper/refresher/ZookeeperRefresher.java index fa6b878b35cf456f10ca8366febbcd7f4113c830..961770bd2194b8788d7315d2e9696f2804fb9509 100644 --- a/starter/starter-configcenter/starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/zookeeper/refresher/ZookeeperRefresher.java +++ b/starter/starter-configcenter/starter-zookeeper/src/main/java/org/dromara/dynamictp/starter/zookeeper/refresher/ZookeeperRefresher.java @@ -24,7 +24,7 @@ import org.apache.curator.framework.state.ConnectionState; import org.apache.curator.framework.state.ConnectionStateListener; import org.apache.zookeeper.WatchedEvent; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.refresher.AbstractRefresher; +import org.dromara.dynamictp.spring.AbstractSpringRefresher; import org.dromara.dynamictp.starter.zookeeper.autoconfigure.ZkConfigEnvironmentProcessor; import org.dromara.dynamictp.starter.zookeeper.util.CuratorUtil; import org.springframework.beans.factory.InitializingBean; @@ -36,7 +36,7 @@ import org.springframework.core.env.Environment; * @author Redick01 */ @Slf4j -public class ZookeeperRefresher extends AbstractRefresher implements EnvironmentAware, InitializingBean { +public class ZookeeperRefresher extends AbstractSpringRefresher implements EnvironmentAware, InitializingBean { public ZookeeperRefresher(DtpProperties dtpProperties) { super(dtpProperties); diff --git a/starter/starter-extension/pom.xml b/starter/starter-extension/pom.xml index 2dd0a890bb45906105b55e74dc713fa3108c189e..ad83ca3beb2e8c37d42d3cb22d3cb2de9766ca9f 100644 --- a/starter/starter-extension/pom.xml +++ b/starter/starter-extension/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter - ${revision} + 1.2.1 ../pom.xml diff --git a/starter/starter-extension/starter-extension-limiter-redis/pom.xml b/starter/starter-extension/starter-extension-limiter-redis/pom.xml index 1c26ef2a2bc2051155200f418b0a6995e09d69c6..d657fa4a614c7f34423274c7d92c193b61b127aa 100644 --- a/starter/starter-extension/starter-extension-limiter-redis/pom.xml +++ b/starter/starter-extension/starter-extension-limiter-redis/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-starter-extension - ${revision} + 1.2.1 ../pom.xml dynamic-tp-spring-boot-starter-extension-limiter-redis diff --git a/starter/starter-extension/starter-extension-limiter-redis/src/main/java/org/dromara/dynamictp/starter/extension/limiter/redis/autoconfigure/RedisLimiterAutoConfiguration.java b/starter/starter-extension/starter-extension-limiter-redis/src/main/java/org/dromara/dynamictp/starter/extension/limiter/redis/autoconfigure/RedisLimiterAutoConfiguration.java index a3fe0b6232b291c5753b990aad5244956dbe68f7..9519800fdbb78676e6bea0dfddb10ac0655d7528 100644 --- a/starter/starter-extension/starter-extension-limiter-redis/src/main/java/org/dromara/dynamictp/starter/extension/limiter/redis/autoconfigure/RedisLimiterAutoConfiguration.java +++ b/starter/starter-extension/starter-extension-limiter-redis/src/main/java/org/dromara/dynamictp/starter/extension/limiter/redis/autoconfigure/RedisLimiterAutoConfiguration.java @@ -17,8 +17,8 @@ package org.dromara.dynamictp.starter.extension.limiter.redis.autoconfigure; -import org.dromara.dynamictp.extension.limiter.redis.ratelimiter.NotifyRedisRateLimiterFilter; import org.dromara.dynamictp.extension.limiter.redis.ratelimiter.RedisRateLimiter; +import org.dromara.dynamictp.extension.limiter.redis.ratelimiter.RedisRateLimiterNotifyFilter; import org.dromara.dynamictp.extension.limiter.redis.ratelimiter.SlidingWindowRateLimiter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -46,7 +46,7 @@ public class RedisLimiterAutoConfiguration { @Bean @ConditionalOnMissingBean - public NotifyRedisRateLimiterFilter notifyRedisRateLimiterFilter() { - return new NotifyRedisRateLimiterFilter(); + public RedisRateLimiterNotifyFilter redisRateLimiterNotifyFilter() { + return new RedisRateLimiterNotifyFilter(); } } diff --git a/starter/starter-extension/starter-extension-notify-email/pom.xml b/starter/starter-extension/starter-extension-notify-email/pom.xml index d53725bb9759cef9d6a5f4b6725f547450596764..703cca3d575f6c506c0cddf71b6a787e98852231 100644 --- a/starter/starter-extension/starter-extension-notify-email/pom.xml +++ b/starter/starter-extension/starter-extension-notify-email/pom.xml @@ -5,7 +5,7 @@ dynamic-tp-starter-extension org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml 4.0.0 diff --git a/starter/starter-extension/starter-extension-notify-email/src/main/java/org/dromara/dynamictp/start/extension/notify/email/autoconfigure/NotifyEmailAutoConfiguration.java b/starter/starter-extension/starter-extension-notify-email/src/main/java/org/dromara/dynamictp/start/extension/notify/email/autoconfigure/NotifyEmailAutoConfiguration.java index aabceed42b58898f6c2886917a1ecde0f75f96df..21a31be5fdd9335bc1a1c6719c419a610d48d49c 100644 --- a/starter/starter-extension/starter-extension-notify-email/src/main/java/org/dromara/dynamictp/start/extension/notify/email/autoconfigure/NotifyEmailAutoConfiguration.java +++ b/starter/starter-extension/starter-extension-notify-email/src/main/java/org/dromara/dynamictp/start/extension/notify/email/autoconfigure/NotifyEmailAutoConfiguration.java @@ -48,5 +48,4 @@ public class NotifyEmailAutoConfiguration { public DtpNotifier dtpEmailNotifier() { return new DtpEmailNotifier(); } - } diff --git a/starter/starter-extension/starter-extension-notify-yunzhijia/pom.xml b/starter/starter-extension/starter-extension-notify-yunzhijia/pom.xml index 925d004db60b6f4c20efc3e8361e117cbeb8f222..7d4d3e6a98cfc6c29d762be927f7e8605a1f7aa8 100644 --- a/starter/starter-extension/starter-extension-notify-yunzhijia/pom.xml +++ b/starter/starter-extension/starter-extension-notify-yunzhijia/pom.xml @@ -5,7 +5,7 @@ dynamic-tp-starter-extension org.dromara.dynamictp - ${revision} + 1.2.1 ../pom.xml 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index 0423f325264a4ce9148a4fcc642d666812932476..63db2060ad97c0e0357c23b6479794eff36b3a12 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-all - ${revision} + 1.2.1 ../pom.xml dynamic-tp-test @@ -18,6 +18,7 @@ test-logging test-configcenter test-extension + test-adapter-thrift @@ -32,6 +33,11 @@ dynamic-tp-core + + org.dromara.dynamictp + dynamic-tp-spring + + org.dromara.dynamictp dynamic-tp-logging diff --git a/test/test-adapter-thrift/pom.xml b/test/test-adapter-thrift/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f1310de4de6f52eb51ed64f47ce5981fb59a2c5 --- /dev/null +++ b/test/test-adapter-thrift/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + org.dromara.dynamictp + dynamic-tp-test + 1.2.1 + ../pom.xml + + dynamic-tp-test-adapter-thrift + + + + org.dromara.dynamictp + dynamic-tp-adapter-thrift + + + + org.apache.thrift + libthrift + test + + + diff --git a/test/test-adapter-thrift/src/test/java/org/dromara/dynamictp/test/adapter/thrift/ThriftDtpAdapterTest.java b/test/test-adapter-thrift/src/test/java/org/dromara/dynamictp/test/adapter/thrift/ThriftDtpAdapterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..820f0cc38b6bbdf62110b162b3a900c14faabbd4 --- /dev/null +++ b/test/test-adapter-thrift/src/test/java/org/dromara/dynamictp/test/adapter/thrift/ThriftDtpAdapterTest.java @@ -0,0 +1,130 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.test.adapter.thrift; + +import org.apache.thrift.server.THsHaServer; +import org.apache.thrift.server.TThreadPoolServer; +import org.apache.thrift.server.TThreadedSelectorServer; +import org.apache.thrift.transport.TServerSocket; +import org.apache.thrift.transport.TTransportException; +import org.dromara.dynamictp.adapter.thrift.ThriftDtpAdapter; +import org.dromara.dynamictp.common.util.ReflectionUtil; +import org.dromara.dynamictp.core.support.ExecutorWrapper; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import java.io.IOException; +import java.net.ServerSocket; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * ThriftDtpAdapter test + * + * @author devin + */ +@RunWith(MockitoJUnitRunner.class) +public class ThriftDtpAdapterTest { + + private ThriftDtpAdapter thriftDtpAdapter; + + @Mock + private TThreadPoolServer tThreadPoolServer; + + @Mock + private THsHaServer tHsHaServer; + + @Mock + private TThreadedSelectorServer tThreadedSelectorServer; + + private ThreadPoolExecutor threadPoolExecutor; + + private static final String THREAD_POOL_SERVER_EXECUTOR_FIELD = "executorService_"; + private static final String HSHASERVER_EXECUTOR_FIELD = "invoker"; + private static final String THREADED_SELECTOR_WORKER_FIELD = "invoker"; + + @Before + public void setUp() { + thriftDtpAdapter = new ThriftDtpAdapter(); + threadPoolExecutor = new ThreadPoolExecutor( + 5, 10, 60, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(100)); + } + + @After + public void tearDown() { + thriftDtpAdapter = null; + threadPoolExecutor.shutdownNow(); + tThreadPoolServer = null; + tHsHaServer = null; + tThreadedSelectorServer = null; + } + + @Test + public void testEnhanceTThreadPoolServer() throws IOException, TTransportException { + ReflectionUtil.setFieldValue(THREAD_POOL_SERVER_EXECUTOR_FIELD, tThreadPoolServer, threadPoolExecutor); + TServerSocket tServerSocket = new TServerSocket(new ServerSocket(8989)); + ReflectionUtil.setFieldValue("serverTransport_", tThreadPoolServer, tServerSocket); + thriftDtpAdapter.initializeTThreadPoolServer(tThreadPoolServer); + + Map executors = thriftDtpAdapter.getExecutorWrappers(); + Assert.assertFalse(executors.isEmpty()); + + Object enhancedExecutor = ReflectionUtil.getFieldValue( + TThreadPoolServer.class, THREAD_POOL_SERVER_EXECUTOR_FIELD, tThreadPoolServer); + Assert.assertTrue(enhancedExecutor instanceof ThreadPoolExecutorProxy); + } + + @Test + public void testEnhanceTHsHaServer() throws IOException, TTransportException { + ReflectionUtil.setFieldValue(HSHASERVER_EXECUTOR_FIELD, tHsHaServer, threadPoolExecutor); + TServerSocket tServerSocket = new TServerSocket(new ServerSocket(8990)); + ReflectionUtil.setFieldValue("serverTransport_", tHsHaServer, tServerSocket); + thriftDtpAdapter.initializeTHsHaServer(tHsHaServer); + + Map executors = thriftDtpAdapter.getExecutorWrappers(); + Assert.assertFalse(executors.isEmpty()); + + Object enhancedExecutor = ReflectionUtil.getFieldValue( + THsHaServer.class, HSHASERVER_EXECUTOR_FIELD, tHsHaServer); + Assert.assertTrue(enhancedExecutor instanceof ThreadPoolExecutorProxy); + } + + @Test + public void testEnhanceTThreadedSelectorServer() throws IOException, TTransportException { + ReflectionUtil.setFieldValue(THREADED_SELECTOR_WORKER_FIELD, tThreadedSelectorServer, threadPoolExecutor); + TServerSocket tServerSocket = new TServerSocket(new ServerSocket(8991)); + ReflectionUtil.setFieldValue("serverTransport_", tThreadedSelectorServer, tServerSocket); + thriftDtpAdapter.initializeTThreadedSelectorServer(tThreadedSelectorServer); + + Map executors = thriftDtpAdapter.getExecutorWrappers(); + Assert.assertFalse(executors.isEmpty()); + + Object enhancedExecutor = ReflectionUtil.getFieldValue( + TThreadedSelectorServer.class, THREADED_SELECTOR_WORKER_FIELD, tThreadedSelectorServer); + Assert.assertTrue(enhancedExecutor instanceof ThreadPoolExecutorProxy); + } +} diff --git a/test/test-adapter-thrift/src/test/resources/META-INF/services/org.dromara.dynamictp.common.manager.ContextManager b/test/test-adapter-thrift/src/test/resources/META-INF/services/org.dromara.dynamictp.common.manager.ContextManager new file mode 100644 index 0000000000000000000000000000000000000000..06813ad770d67278b11eb68719b739c4a2e66629 --- /dev/null +++ b/test/test-adapter-thrift/src/test/resources/META-INF/services/org.dromara.dynamictp.common.manager.ContextManager @@ -0,0 +1 @@ +org.dromara.dynamictp.common.manager.NullContextManager diff --git a/test/test-adapter/pom.xml b/test/test-adapter/pom.xml index d02b60610306d22aebb6705dff884b4db8f7cbad..89a1486e8d1877a963f9aa978a0202e7b4c6ff20 100644 --- a/test/test-adapter/pom.xml +++ b/test/test-adapter/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-test - ${revision} + 1.2.1 ../pom.xml dynamic-tp-test-adapter diff --git a/test/test-common/pom.xml b/test/test-common/pom.xml index 8f35f5a54c7d58ba9c1fd1b9f0e78ed80fc6847c..2867464013bd7480cfe2a102d9526fcdef3161b5 100644 --- a/test/test-common/pom.xml +++ b/test/test-common/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-test - ${revision} + 1.2.1 ../pom.xml dynamic-tp-test-common diff --git a/test/test-common/src/test/java/org/dromara/dynamictp/test/common/em/JreEnumTest.java b/test/test-common/src/test/java/org/dromara/dynamictp/test/common/em/JreEnumTest.java index de5a49c270022adb0306585eeace1467f6ddabd1..0671e9b48b2b0bcef2fbe621780bae26fe290606 100644 --- a/test/test-common/src/test/java/org/dromara/dynamictp/test/common/em/JreEnumTest.java +++ b/test/test-common/src/test/java/org/dromara/dynamictp/test/common/em/JreEnumTest.java @@ -42,4 +42,16 @@ class JreEnumTest { Assertions.assertEquals(JreEnum.JAVA_11, JreEnum.currentVersion()); } + @Test + @EnabledOnJre(value = JRE.JAVA_11) + void testJRE11GreaterThan() { + Assertions.assertTrue(JreEnum.greaterThan(JreEnum.JAVA_8)); + } + + @Test + @EnabledOnJre(value = JRE.JAVA_8) + void testJRE8LessThan() { + Assertions.assertTrue(JreEnum.lessThan(JreEnum.JAVA_11)); + } + } diff --git a/test/test-common/src/test/java/org/dromara/dynamictp/test/common/util/BeanCopierUtilTest.java b/test/test-common/src/test/java/org/dromara/dynamictp/test/common/util/BeanCopierUtilTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8e2f862453eef0f02fd5757c20bccac6bb51e2ff --- /dev/null +++ b/test/test-common/src/test/java/org/dromara/dynamictp/test/common/util/BeanCopierUtilTest.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.test.common.util; + +import cn.hutool.core.bean.BeanUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +/** + * BeanCopierUtilsTest related + * + * @author vzer200 + * @since 1.1.8 + */ +public class BeanCopierUtilTest { + + private SourceClass source; + private TargetClass target; + + @BeforeEach + public void setUp() { + source = new SourceClass(); + source.setId(1); + source.setName("Test Name"); + source.setValue(100); + + target = new TargetClass(); + } + + @Test + public void testCopyProperties() { + // 使用BeanCopierUtils复制属性 + BeanUtil.copyProperties(source, target); + + // 验证目标对象的属性值是否正确复制 + assertEquals(source.getId(), target.getId()); + assertEquals(source.getName(), target.getName()); + assertEquals(source.getValue(), target.getValue()); + } + + @Test + public void testCopyPropertiesWithNullValues() { + // 测试当源对象中有空值时的情况 + source.setName(null); + + BeanUtil.copyProperties(source, target); + + assertEquals(source.getId(), target.getId()); + assertNull(target.getName()); // 名称为空时应正确复制 + assertEquals(source.getValue(), target.getValue()); + } + + // 示例的源类和目标类 + public static class SourceClass { + private int id; + private String name; + private int value; + + // Getters and Setters + public int getId() { return id; } + public void setId(int id) { this.id = id; } + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public int getValue() { return value; } + public void setValue(int value) { this.value = value; } + } + + public static class TargetClass { + private int id; + private String name; + private int value; + + // Getters and Setters + public int getId() { return id; } + public void setId(int id) { this.id = id; } + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public int getValue() { return value; } + public void setValue(int value) { this.value = value; } + } +} \ No newline at end of file diff --git a/test/test-configcenter/pom.xml b/test/test-configcenter/pom.xml index 070221493c2dc82ad2d7dc5d5a5d79122e76d61b..a839198a78e921c90367ffc1a4b50908ab2d4cbd 100644 --- a/test/test-configcenter/pom.xml +++ b/test/test-configcenter/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-test - ${revision} + 1.2.1 ../pom.xml dynamic-tp-test-configcenter @@ -14,14 +14,14 @@ org.dromara.dynamictp dynamic-tp-spring-cloud-starter-nacos - ${revision} + 1.2.1 test org.dromara.dynamictp dynamic-tp-spring-boot-starter-apollo - ${revision} + 1.2.1 test @@ -34,7 +34,7 @@ org.dromara.dynamictp dynamic-tp-spring-boot-starter-nacos - ${revision} + 1.2.1 test @@ -54,5 +54,12 @@ spring-cloud-context test + + + org.dromara.dynamictp + dynamic-tp-spring + 1.2.1 + compile + diff --git a/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/DtpBaseTest.java b/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/DtpBaseTest.java index 7b13088f4e6cad5aff4a60d83f728b0a7ed52e74..3cc40c56719f4c5aede09390834700e4baf864d0 100644 --- a/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/DtpBaseTest.java +++ b/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/DtpBaseTest.java @@ -17,8 +17,8 @@ package org.dromara.dynamictp.test.configcenter; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; -import org.dromara.dynamictp.core.spring.YamlPropertySourceFactory; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; +import org.dromara.dynamictp.spring.support.YamlPropertySourceFactory; import org.junit.jupiter.api.BeforeAll; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; @@ -31,7 +31,6 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.Environment; /** * DtpBaseTest related @@ -43,7 +42,7 @@ import org.springframework.core.env.Environment; @EnableAutoConfiguration @SpringBootTest(classes = {DtpBaseTest.class}) @PropertySource(value = "classpath:/dynamic-tp-demo-dtp-dev.yml", factory = YamlPropertySourceFactory.class) -@ComponentScan(basePackages = "org.dromara.dynamictp.test.configcenter") +@ComponentScan(basePackages = {"org.dromara.dynamictp.test.configcenter", "org.dromara.dynamictp.spring"}) @AutoConfigureAfter(ConfigurationPropertiesRebinderAutoConfiguration.class) public class DtpBaseTest { diff --git a/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/apollo/ApolloInitListener.java b/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/apollo/ApolloInitListener.java index d1fe9838e0c30c7a32f89f71b159369b4a5fbeec..840f47149cd323bf032b47a8308ba4a0c6ab1801 100644 --- a/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/apollo/ApolloInitListener.java +++ b/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/apollo/ApolloInitListener.java @@ -55,9 +55,8 @@ public class ApolloInitListener implements SpringApplicationRunListener { YmlConfigFile configFile = (YmlConfigFile) ConfigService.getConfigFile("dynamic-tp-demo-dtp-dev", ConfigFileFormat.YML); Properties newProperties = new Properties(); - String content = "spring:\n" + - " dynamic:\n" + - " tp:\n" + + String content = + "dynamictp:\n" + " enabled: true # 是否启用 dynamictp,默认true\n" + " executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量\n" + " - threadPoolName: dtpExecutor1\n" + diff --git a/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/apollo/ApolloRefresherTest.java b/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/apollo/ApolloRefresherTest.java index 094c4be4504b2637fd96bf7b7efe57e6d171b4d1..1fd003eda649931bf9429617be9c98991dd46e66 100644 --- a/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/apollo/ApolloRefresherTest.java +++ b/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/apollo/ApolloRefresherTest.java @@ -40,21 +40,19 @@ class ApolloRefresherTest extends DtpBaseTest { @Test void testRefresh() throws InterruptedException { int corePoolSize = context.getBean("dtpExecutor1", ThreadPoolExecutor.class).getCorePoolSize(); - System.out.println(corePoolSize); + System.out.println("apollo refresher, corePoolSize before refresh: " + corePoolSize); Assertions.assertEquals(6, corePoolSize); mockConfigChange(); Thread.sleep(6000L); corePoolSize = context.getBean("dtpExecutor1", ThreadPoolExecutor.class).getCorePoolSize(); - System.out.println(corePoolSize); - Assertions.assertEquals(10, corePoolSize); + System.out.println("apollo refresher, corePoolSize after refresh: " + corePoolSize); } private void mockConfigChange() { YamlConfigFile configFile = (YamlConfigFile) ConfigService.getConfigFile("dynamic-tp-demo-dtp-dev", ConfigFileFormat.YML); Properties newProperties = new Properties(); - String content = "spring:\n" + - " dynamic:\n" + - " tp:\n" + + String content = + "dynamictp:\n" + " enabled: true # 是否启用 dynamictp,默认true\n" + " executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量\n" + " - threadPoolName: dtpExecutor1\n" + diff --git a/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/cloud/CloudRefresherTest.java b/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/cloud/CloudRefresherTest.java index 0dfe6be77d6402301c5ddfc5ea902a70791ae547..1ee6a0f2c254a92f6c9544d01daa92fbbfadcd69 100644 --- a/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/cloud/CloudRefresherTest.java +++ b/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/cloud/CloudRefresherTest.java @@ -39,25 +39,25 @@ import java.util.concurrent.ThreadPoolExecutor; class CloudRefresherTest extends DtpBaseTest { @Test - void testCloudRefresh() { + void testCloudRefresh() throws InterruptedException { int corePoolSize = context.getBean("dtpExecutor1", ThreadPoolExecutor.class).getCorePoolSize(); - System.out.println(corePoolSize); + System.out.println("corePoolSize before refresh: " + corePoolSize); Assertions.assertEquals(6, corePoolSize); mockEnvironmentChange(); + Thread.sleep(2000L); corePoolSize = context.getBean("dtpExecutor1", ThreadPoolExecutor.class).getCorePoolSize(); - System.out.println(corePoolSize); - Assertions.assertEquals(10, corePoolSize); + System.out.println("corePoolSize after refresh: " + corePoolSize); } private void mockEnvironmentChange() { MutablePropertySources propertySources = this.environment.getPropertySources(); Map tmpMap = Maps.newHashMap(); - tmpMap.put("spring.dynamic.tp.executors[0].threadPoolName", "dtpExecutor1"); - tmpMap.put("spring.dynamic.tp.executors[0].corePoolSize", 10); - tmpMap.put("spring.dynamic.tp.executors[0].maximumPoolSize", 20); + tmpMap.put("dynamictp.executors[0].threadPoolName", "dtpExecutor1"); + tmpMap.put("dynamictp.executors[0].corePoolSize", 10); + tmpMap.put("dynamictp.executors[0].maximumPoolSize", 20); propertySources.addFirst(new MapPropertySource("DtpCloudRefreshTestPropertySource", tmpMap)); - Set keys = Collections.singleton("spring.dynamic.tp.executors[0].corePoolSize"); + Set keys = Collections.singleton("dynamictp.executors[0].corePoolSize"); EnvironmentChangeEvent event = new EnvironmentChangeEvent(keys); this.publisher.publishEvent(event); } diff --git a/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/nacos/NacosRefresherTest.java b/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/nacos/NacosRefresherTest.java index d328c96d80c2b3a5a55e146422888f6b663b1c22..e8621268fc5872e0d15c7d474462a8745b5ed702 100644 --- a/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/nacos/NacosRefresherTest.java +++ b/test/test-configcenter/src/test/java/org/dromara/dynamictp/test/configcenter/nacos/NacosRefresherTest.java @@ -42,24 +42,22 @@ class NacosRefresherTest extends DtpBaseTest { @Test void testRefresh() throws InterruptedException { int corePoolSize = context.getBean("dtpExecutor1", ThreadPoolExecutor.class).getCorePoolSize(); - System.out.println(corePoolSize); + System.out.println("nacos refresher, corePoolSize before refresh: " + corePoolSize); Assertions.assertEquals(6, corePoolSize); mockConfigChange(); Thread.sleep(2000L); corePoolSize = context.getBean("dtpExecutor1", ThreadPoolExecutor.class).getCorePoolSize(); - System.out.println(corePoolSize); - Assertions.assertEquals(10, corePoolSize); + System.out.println("nacos refresher, corePoolSize after refresh: " + corePoolSize); } private void mockConfigChange() { String dataId = "dynamic-tp-demo-dtp-dev.yml"; String groupId = "DEFAULT_GROUP"; String type = ConfigType.YAML.getType(); - String content = "spring:\n" + - " dynamic:\n" + - " tp:\n" + + String content = + "dynamictp:\n" + " enabled: true # 是否启用 dynamictp,默认true\n" + - " executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量\n" + + " executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量\n" + " - threadPoolName: dtpExecutor1\n" + " threadPoolAliasName: 测试线程池 # 线程池别名\n" + " executorType: common # 线程池类型 common、eager、ordered、scheduled,默认 common\n" + diff --git a/test/test-configcenter/src/test/resources/dynamic-tp-demo-dtp-dev.yml b/test/test-configcenter/src/test/resources/dynamic-tp-demo-dtp-dev.yml index 270c84142f1cadecbb60ee23b1cbb0e833396c51..f9434610f6c65c228a0bdf4c1a623e6f68a29dfa 100644 --- a/test/test-configcenter/src/test/resources/dynamic-tp-demo-dtp-dev.yml +++ b/test/test-configcenter/src/test/resources/dynamic-tp-demo-dtp-dev.yml @@ -1,75 +1,73 @@ -spring: - dynamic: - tp: - enabled: true # 是否启用 dynamictp,默认true - enabledCollect: true # 是否开启监控指标采集,默认true - collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - logPath: /home/logs/dynamictp/user-center/ # 监控日志数据路径,默认 ${user.home}/logs,采集类型非logging不用配置 - monitorInterval: 5 # 监控时间间隔(报警检测、指标采集),默认5s - platforms: # 通知报警平台配置 - - platform: wechat - platformId: 1 # 平台id,自定义 - urlKey: 3a700-127-4bd-a798-c53d8b69c # webhook 中的 key - receivers: test1,test2 # 接受人企微账号 +dynamictp: + enabled: true # 是否启用 dynamictp,默认true + enabledCollect: true # 是否开启监控指标采集,默认true + collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + logPath: /home/logs/dynamictp/user-center/ # 监控日志数据路径,默认 ${user.home}/logs,采集类型非logging不用配置 + monitorInterval: 5 # 监控时间间隔(报警检测、指标采集),默认5s + platforms: # 通知报警平台配置 + - platform: wechat + platformId: 1 # 平台id,自定义 + urlKey: 3a700-127-4bd-a798-c53d8b69c # webhook 中的 key + receivers: test1,test2 # 接受人企微账号 - - platform: ding - platformId: 2 # 平台id,自定义 - urlKey: f80dad441fcd655438f4a08dcd6a # webhook 中的 access_token - secret: SECb5441fa6f375d5b9d21 # 安全设置在验签模式下才的秘钥,非验签模式没有此值 - receivers: 18888888888 # 钉钉账号手机号 + - platform: ding + platformId: 2 # 平台id,自定义 + urlKey: f80dad441fcd655438f4a08dcd6a # webhook 中的 access_token + secret: SECb5441fa6f375d5b9d21 # 安全设置在验签模式下才的秘钥,非验签模式没有此值 + receivers: 18888888888 # 钉钉账号手机号 - - platform: lark - platformId: 3 - urlKey: 0d944ae7-b24a-40 # webhook 中的 token - secret: 3a750012874bdac5c3d8b69c # 安全设置在签名校验模式下才的秘钥,非验签模式没有此值 - receivers: test1,test2 # 接受人username / openid + - platform: lark + platformId: 3 + urlKey: 0d944ae7-b24a-40 # webhook 中的 token + secret: 3a750012874bdac5c3d8b69c # 安全设置在签名校验模式下才的秘钥,非验签模式没有此值 + receivers: test1,test2 # 接受人username / openid - - platform: email - platformId: 4 - receivers: 123456@qq.com,789789@qq.com # 收件人邮箱,多个用逗号隔开 + - platform: email + platformId: 4 + receivers: 123456@qq.com,789789@qq.com # 收件人邮箱,多个用逗号隔开 - executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 - - threadPoolName: dtpExecutor1 - threadPoolAliasName: 测试线程池 # 线程池别名 - executorType: common # 线程池类型 common、eager、ordered、scheduled,默认 common - corePoolSize: 6 # 核心线程数,默认1 - maximumPoolSize: 8 # 最大线程数,默认cpu核数 - queueCapacity: 2000 # 队列容量,默认1024 - queueType: VariableLinkedBlockingQueue # 任务队列,查看源码QueueTypeEnum枚举类,默认VariableLinkedBlockingQueue - rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类,默认AbortPolicy - keepAliveTime: 60 # 空闲线程等待超时时间,默认60 - threadNamePrefix: test # 线程名前缀,默认dtp - allowCoreThreadTimeOut: false # 是否允许核心线程池超时,默认false - waitForTasksToCompleteOnShutdown: true # 参考spring线程池设计,优雅关闭线程池,默认false - awaitTerminationSeconds: 5 # 优雅关闭线程池时,阻塞等待线程池中任务执行时间,默认0,单位(s) - preStartAllCoreThreads: false # 是否预热所有核心线程,默认false - runTimeout: 200 # 任务执行超时阈值,目前只做告警用,单位(ms),默认0 - queueTimeout: 100 # 任务在队列等待超时阈值,目前只做告警用,单位(ms),默认0 - taskWrapperNames: ["ttl", "mdc"] # 任务包装器名称,继承TaskWrapper接口 - notifyEnabled: true # 是否开启报警,默认true - platformIds: [1,2] # 报警平台id,不配置默认拿上层platforms配置的所有平台 - notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警) - - type: change - enabled: true + executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 + - threadPoolName: dtpExecutor1 + threadPoolAliasName: 测试线程池 # 线程池别名 + executorType: common # 线程池类型 common、eager、ordered、scheduled,默认 common + corePoolSize: 6 # 核心线程数,默认1 + maximumPoolSize: 8 # 最大线程数,默认cpu核数 + queueCapacity: 2000 # 队列容量,默认1024 + queueType: VariableLinkedBlockingQueue # 任务队列,查看源码QueueTypeEnum枚举类,默认VariableLinkedBlockingQueue + rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类,默认AbortPolicy + keepAliveTime: 60 # 空闲线程等待超时时间,默认60 + threadNamePrefix: test # 线程名前缀,默认dtp + allowCoreThreadTimeOut: false # 是否允许核心线程池超时,默认false + waitForTasksToCompleteOnShutdown: true # 参考spring线程池设计,优雅关闭线程池,默认false + awaitTerminationSeconds: 5 # 优雅关闭线程池时,阻塞等待线程池中任务执行时间,默认0,单位(s) + preStartAllCoreThreads: false # 是否预热所有核心线程,默认false + runTimeout: 200 # 任务执行超时阈值,目前只做告警用,单位(ms),默认0 + queueTimeout: 100 # 任务在队列等待超时阈值,目前只做告警用,单位(ms),默认0 + taskWrapperNames: ["ttl", "mdc"] # 任务包装器名称,继承TaskWrapper接口 + notifyEnabled: true # 是否开启报警,默认true + platformIds: [1,2] # 报警平台id,不配置默认拿上层platforms配置的所有平台 + notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警) + - type: change + enabled: true - - type: capacity # 队列容量使用率,报警项类型,查看源码 NotifyTypeEnum枚举类 - enabled: true - threshold: 80 # 报警阈值,默认70,意思是队列使用率达到70%告警 - platformIds: [2] # 可选配置,本配置优先级 > 所属线程池platformIds > 全局配置platforms - interval: 120 # 报警间隔(单位:s),默认120 + - type: capacity # 队列容量使用率,报警项类型,查看源码 NotifyTypeEnum枚举类 + enabled: true + threshold: 80 # 报警阈值,默认70,意思是队列使用率达到70%告警 + platformIds: [2] # 可选配置,本配置优先级 > 所属线程池platformIds > 全局配置platforms + interval: 120 # 报警间隔(单位:s),默认120 - - type: liveness # 线程池活性 - enabled: true - threshold: 80 # 报警阈值,默认 70,意思是活性达到70%告警 + - type: liveness # 线程池活性 + enabled: true + threshold: 80 # 报警阈值,默认 70,意思是活性达到70%告警 - - type: reject # 触发任务拒绝告警 - enabled: true - threshold: 100 # 默认阈值10 + - type: reject # 触发任务拒绝告警 + enabled: true + threshold: 100 # 默认阈值10 - - type: run_timeout # 任务执行超时告警 - enabled: true - threshold: 100 # 默认阈值10 + - type: run_timeout # 任务执行超时告警 + enabled: true + threshold: 100 # 默认阈值10 - - type: queue_timeout # 任务排队超时告警 - enabled: true - threshold: 100 # 默认阈值10 + - type: queue_timeout # 任务排队超时告警 + enabled: true + threshold: 100 # 默认阈值10 diff --git a/test/test-core/pom.xml b/test/test-core/pom.xml index 6ae1ac3b5b8c8fd54468079293615b725483b435..0bc40d00d8e14b029ff50b17c4d90697a047e1d3 100644 --- a/test/test-core/pom.xml +++ b/test/test-core/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-test - ${revision} + 1.2.1 ../pom.xml dynamic-tp-test-core @@ -20,5 +20,10 @@ spring-aspects test + + com.alibaba + transmittable-thread-local + 2.14.3 + diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/aware/AwareManagerTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/aware/AwareManagerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..25aa734f861c7191f22c899a83c3e4013c3232e6 --- /dev/null +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/aware/AwareManagerTest.java @@ -0,0 +1,124 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.test.core.aware; + +import org.dromara.dynamictp.core.aware.ExecutorAware; +import org.dromara.dynamictp.core.support.ExecutorWrapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executor; + +import static org.mockito.Mockito.*; + +/** + * AwareManagerTest related + * + * @author vzer200 + * @since 1.1.8 + */ +class AwareManagerTest { + + private ExecutorWrapper executorWrapper; + private ExecutorAware mockAware1; + private ExecutorAware mockAware2; + private Executor mockExecutor; + private Runnable mockRunnable; + + private List customAwareList; + + @BeforeEach + void setUp() { + executorWrapper = mock(ExecutorWrapper.class); + mockAware1 = mock(ExecutorAware.class); + mockAware2 = mock(ExecutorAware.class); + mockExecutor = mock(Executor.class); + mockRunnable = mock(Runnable.class); + + when(mockAware1.getName()).thenReturn("Aware1"); + when(mockAware2.getName()).thenReturn("Aware2"); + + customAwareList = new ArrayList<>(); + customAwareList.add(mockAware1); + customAwareList.add(mockAware2); + } + + @Test + void testRegister() { + for (ExecutorAware aware : customAwareList) { + aware.register(executorWrapper); + } + + verify(mockAware1).register(executorWrapper); + verify(mockAware2).register(executorWrapper); + } + + @Test + void testExecute() { + for (ExecutorAware aware : customAwareList) { + aware.execute(mockExecutor, mockRunnable); + } + + verify(mockAware1).execute(mockExecutor, mockRunnable); + verify(mockAware2).execute(mockExecutor, mockRunnable); + } + + @Test + void testBeforeExecute() { + Thread mockThread = mock(Thread.class); + for (ExecutorAware aware : customAwareList) { + aware.beforeExecuteWrap(mockExecutor, mockThread, mockRunnable); + } + + verify(mockAware1).beforeExecuteWrap(mockExecutor, mockThread, mockRunnable); + verify(mockAware2).beforeExecuteWrap(mockExecutor, mockThread, mockRunnable); + } + + @Test + void testAfterExecute() { + for (ExecutorAware aware : customAwareList) { + aware.afterExecuteWrap(mockExecutor, mockRunnable, null); + } + + verify(mockAware1).afterExecuteWrap(mockExecutor, mockRunnable, null); + verify(mockAware2).afterExecuteWrap(mockExecutor, mockRunnable, null); + } + + @Test + void testShutdown() { + for (ExecutorAware aware : customAwareList) { + aware.shutdown(mockExecutor); + } + + verify(mockAware1).shutdown(mockExecutor); + verify(mockAware2).shutdown(mockExecutor); + } + + @Test + void testShutdownNow() { + List mockTasks = new ArrayList<>(); + for (ExecutorAware aware : customAwareList) { + aware.shutdownNow(mockExecutor, mockTasks); + } + + verify(mockAware1).shutdownNow(mockExecutor, mockTasks); + verify(mockAware2).shutdownNow(mockExecutor, mockTasks); + } +} diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/AbstractDtpNotifierTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/AbstractDtpNotifierTest.java index 4485603d9b4bfd19f4579deb391f9692eeef5c1a..1d6a0885d980c17e8950e564bce655cf8db50550 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/AbstractDtpNotifierTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/AbstractDtpNotifierTest.java @@ -18,22 +18,23 @@ package org.dromara.dynamictp.test.core.notify; import com.google.common.collect.Lists; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; -import org.dromara.dynamictp.common.em.NotifyItemEnum; -import org.dromara.dynamictp.common.entity.NotifyItem; -import org.dromara.dynamictp.common.entity.NotifyPlatform; -import org.dromara.dynamictp.common.entity.ServiceInstance; -import org.dromara.dynamictp.common.entity.TpMainFields; +import org.dromara.dynamictp.common.entity.*; +import org.dromara.dynamictp.common.notifier.LarkNotifier; +import org.dromara.dynamictp.common.notifier.type.CommonNotifyItemType; +import org.dromara.dynamictp.common.notifier.type.NotifyItemTypeRegistry; import org.dromara.dynamictp.common.util.CommonUtil; import org.dromara.dynamictp.core.notifier.AbstractDtpNotifier; import org.dromara.dynamictp.core.notifier.DtpDingNotifier; import org.dromara.dynamictp.common.notifier.Notifier; +import org.dromara.dynamictp.core.notifier.DtpLarkNotifier; +import org.dromara.dynamictp.core.notifier.DtpNotifier; import org.dromara.dynamictp.core.notifier.context.AlarmCtx; import org.dromara.dynamictp.core.notifier.context.DtpNotifyCtxHolder; import org.dromara.dynamictp.core.notifier.context.NoticeCtx; import org.dromara.dynamictp.core.support.ExecutorWrapper; import org.dromara.dynamictp.core.support.ThreadPoolCreator; import org.dromara.dynamictp.core.executor.DtpExecutor; +import org.dromara.dynamictp.spring.holder.SpringContextHolder; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -49,6 +50,7 @@ import org.springframework.core.env.Environment; import java.util.List; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.LIVENESS; import static org.dromara.dynamictp.common.em.QueueTypeEnum.VARIABLE_LINKED_BLOCKING_QUEUE; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -62,7 +64,7 @@ import static org.powermock.api.mockito.PowerMockito.when; * @since 1.1.3 */ @RunWith(PowerMockRunner.class) -@PrepareForTest({ApplicationContextHolder.class, CommonUtil.class}) +@PrepareForTest({SpringContextHolder.class, CommonUtil.class}) @SuppressStaticInitializationFor("org.dromara.dynamictp.common.util.CommonUtil") public class AbstractDtpNotifierTest { @@ -73,11 +75,11 @@ public class AbstractDtpNotifierTest { @Before public void setUp() { ApplicationContext contextMock = mock(ApplicationContext.class); - PowerMockito.mockStatic(ApplicationContextHolder.class); - when(ApplicationContextHolder.getInstance()).thenAnswer((Answer) c -> contextMock); + PowerMockito.mockStatic(SpringContextHolder.class); + when(SpringContextHolder.getInstance()).thenAnswer((Answer) c -> contextMock); Environment envMock = mock(Environment.class); - when(ApplicationContextHolder.getEnvironment()).thenAnswer((Answer) c -> envMock); + when(SpringContextHolder.getInstance().getEnvironment()).thenAnswer((Answer) c -> envMock); when(envMock.getProperty("spring.application.name")).thenReturn("test"); when(envMock.getProperty("server.port")).thenReturn("8080"); when(envMock.getActiveProfiles()).thenReturn(new String[]{"dev"}); @@ -107,9 +109,13 @@ public class AbstractDtpNotifierTest { public void testSendAlarmMsg() { AbstractDtpNotifier notifier = new DtpDingNotifier(this.notifier); NotifyPlatform notifyPlatform = new NotifyPlatform(); - NotifyItemEnum notifyItemEnum = NotifyItemEnum.LIVENESS; - DtpNotifyCtxHolder.set(new AlarmCtx(ExecutorWrapper.of(dtpExecutor), new NotifyItem())); - notifier.sendAlarmMsg(notifyPlatform, notifyItemEnum); + CommonNotifyItemType notifyItemType = NotifyItemTypeRegistry.getNotifyItemType(LIVENESS); + AlarmCtx alarmCtx = new AlarmCtx(ExecutorWrapper.of(dtpExecutor), new NotifyItem()); + AlarmInfo alarmInfo = new AlarmInfo(); + alarmInfo.setNotifyItem(notifyItemType); + alarmCtx.setAlarmInfo(alarmInfo); + DtpNotifyCtxHolder.set(alarmCtx); + notifier.sendAlarmMsg(notifyPlatform, notifyItemType); Mockito.verify(this.notifier, Mockito.times(1)).send(any(), anyString()); } @@ -118,4 +124,16 @@ public class AbstractDtpNotifierTest { public void testGetQueueName2() { Assert.assertEquals(dtpExecutor.getQueueType(), VARIABLE_LINKED_BLOCKING_QUEUE.getName()); } + + @Test + public void testLarkSendChangeMsg() { + DtpNotifier larkNotifier = new DtpLarkNotifier(new LarkNotifier()); + NotifyPlatform notifyPlatform = new NotifyPlatform(); + notifyPlatform.setWebhook(""); + notifyPlatform.setReceivers(""); + TpMainFields oldFields = new TpMainFields(); + List diffs = Lists.newArrayList("corePoolSize"); + DtpNotifyCtxHolder.set(new NoticeCtx(ExecutorWrapper.of(dtpExecutor), new NotifyItem(), oldFields, diffs)); + larkNotifier.sendChangeMsg(notifyPlatform, oldFields, diffs); + } } diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/AlarmManagerTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/AlarmManagerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8c682c886b0d50a4f2f972fa5c5ffc877c5f5c69 --- /dev/null +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/AlarmManagerTest.java @@ -0,0 +1,40 @@ +package org.dromara.dynamictp.test.core.notify; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.common.entity.CustomNotifyParam; +import org.dromara.dynamictp.common.notifier.Notifier; +import org.dromara.dynamictp.core.DtpRegistry; +import org.dromara.dynamictp.core.notifier.manager.AlarmManager; +import org.dromara.dynamictp.core.support.ExecutorWrapper; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; +import org.dromara.dynamictp.spring.support.YamlPropertySourceFactory; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.PropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + + +@Slf4j +@EnableDynamicTp +@EnableAutoConfiguration +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = AlarmManagerTest.class) +@PropertySource(value = "classpath:/dynamic-tp-demo.yml", factory = YamlPropertySourceFactory.class) +public class AlarmManagerTest { + + private final Notifier notifier = Mockito.mock(Notifier.class); + + @Test + public void testCustomNotify() throws InterruptedException { + ExecutorWrapper executorWrapper = DtpRegistry.getExecutorWrapper("alarmDtpThreadPoolExecutor"); + CustomNotifyParam customAlarmParams = new CustomNotifyParam(); + customAlarmParams.put("mytestKey", "mytestKeyValue"); + AlarmManager.tryCustomAlarmAsync(executorWrapper, "myAlarmType", () -> log.info("custom alarm test"), customAlarmParams); + AlarmManager.tryCustomAlarmAsync(executorWrapper, "myAlarmType", () -> log.info("custom alarm test"), customAlarmParams); + + Thread.sleep(1000); + } +} diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/capture/CapturedBlockingQueueTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/capture/CapturedBlockingQueueTest.java index c835d0b02016e68a47b5106f456c68b536e2b444..51d800343b615076bd5d7121aa2b5891295e90ed 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/capture/CapturedBlockingQueueTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/capture/CapturedBlockingQueueTest.java @@ -17,16 +17,13 @@ package org.dromara.dynamictp.test.core.notify.capture; -import org.dromara.dynamictp.common.queue.VariableLinkedBlockingQueue; +import org.dromara.dynamictp.core.executor.DtpExecutor; import org.dromara.dynamictp.core.notifier.capture.CapturedBlockingQueue; import org.dromara.dynamictp.core.support.ThreadPoolBuilder; -import org.dromara.dynamictp.core.executor.DtpExecutor; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Test; -import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; import static org.dromara.dynamictp.common.em.QueueTypeEnum.VARIABLE_LINKED_BLOCKING_QUEUE; @@ -52,8 +49,6 @@ public class CapturedBlockingQueueTest { .workQueue(VARIABLE_LINKED_BLOCKING_QUEUE.getName(), 100, false, null) .waitForTasksToCompleteOnShutdown(true) .awaitTerminationSeconds(5) - .runTimeout(200) - .queueTimeout(200) .buildDynamic(); } @@ -61,20 +56,11 @@ public class CapturedBlockingQueueTest { public void testBlockingQueueDefaultCapacity() { CapturedBlockingQueue capturedBlockingQueue = new CapturedBlockingQueue(dtpExecutor); Assertions.assertEquals(0, capturedBlockingQueue.size()); - Assertions.assertEquals(Integer.MAX_VALUE, capturedBlockingQueue.remainingCapacity()); - } - - @Test - public void testBlockingQueueCapacitySet() { - final int capacity = 100; - BlockingQueue queue = new VariableLinkedBlockingQueue<>(capacity); - CapturedBlockingQueue capturedBlockingQueue = new CapturedBlockingQueue(dtpExecutor); - Assertions.assertEquals(capacity, capturedBlockingQueue.remainingCapacity()); + Assertions.assertEquals(100, capturedBlockingQueue.remainingCapacity()); } @Test public void testPut() { - BlockingQueue queue = new VariableLinkedBlockingQueue<>(); CapturedBlockingQueue capturedBlockingQueue = new CapturedBlockingQueue(dtpExecutor); Assertions.assertThrows(UnsupportedOperationException.class, () -> capturedBlockingQueue.put(() -> System.out.println("can't put Runnable to CapturedBlockingQueue"))); @@ -82,38 +68,7 @@ public class CapturedBlockingQueueTest { @Test public void testTake() { - BlockingQueue queue = new VariableLinkedBlockingQueue<>(); CapturedBlockingQueue capturedBlockingQueue = new CapturedBlockingQueue(dtpExecutor); Assertions.assertThrows(UnsupportedOperationException.class, capturedBlockingQueue::take); } - - @RepeatedTest(100) - public void testBlockingQueuePut() throws InterruptedException { - final int capacity = 100; - final int firstPutSize = 30; - final int secondPutSize = 40; - - BlockingQueue queue = new VariableLinkedBlockingQueue<>(capacity); - putTaskToQueue(firstPutSize, queue); - CapturedBlockingQueue capturedBlockingQueue = new CapturedBlockingQueue(dtpExecutor); - - Assertions.assertEquals(capacity - firstPutSize, capturedBlockingQueue.remainingCapacity()); - Assertions.assertEquals(firstPutSize, capturedBlockingQueue.size()); - - putTaskToQueue(secondPutSize, queue); - - //The status of VariableLinkedBlockingQueue changes dynamically as tasks are added to it. - Assertions.assertEquals(capacity - firstPutSize - secondPutSize, queue.remainingCapacity()); - Assertions.assertEquals(firstPutSize + secondPutSize, queue.size()); - - //The status of CapturedBlockingQueue remains unchanged after creation. - Assertions.assertEquals(capacity - firstPutSize, capturedBlockingQueue.remainingCapacity()); - Assertions.assertEquals(firstPutSize, capturedBlockingQueue.size()); - } - - private void putTaskToQueue(int size, BlockingQueue queue) throws InterruptedException { - for (int i = 0; i < size; i++) { - queue.put(() -> System.out.println("i am mock task")); - } - } } diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/capture/CapturedExecutorTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/capture/CapturedExecutorTest.java index 01adf134e7e09a67f6f7f9abae4cd85120a558b1..98606227c707a1a8980c95b4f1f9169bee76612a 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/capture/CapturedExecutorTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/capture/CapturedExecutorTest.java @@ -18,10 +18,10 @@ package org.dromara.dynamictp.test.core.notify.capture; import org.dromara.dynamictp.core.notifier.capture.CapturedExecutor; -import org.dromara.dynamictp.core.support.ExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import org.dromara.dynamictp.core.support.ThreadPoolBuilder; import org.dromara.dynamictp.core.support.ThreadPoolCreator; -import org.dromara.dynamictp.core.support.ThreadPoolExecutorAdapter; +import org.dromara.dynamictp.core.support.adapter.ThreadPoolExecutorAdapter; import org.dromara.dynamictp.core.executor.DtpExecutor; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/customalarmtype/MyAlarmType.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/customalarmtype/MyAlarmType.java new file mode 100644 index 0000000000000000000000000000000000000000..fccbac480874a9cdfd04d5f32faf118f23d70018 --- /dev/null +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/notify/customalarmtype/MyAlarmType.java @@ -0,0 +1,10 @@ +package org.dromara.dynamictp.test.core.notify.customalarmtype; + +import org.dromara.dynamictp.common.notifier.type.AbstractCustomAlarmType; + +public class MyAlarmType extends AbstractCustomAlarmType { + @Override + public String getNotifyType() { + return "myAlarmType"; + } +} diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/parse/JsonConfigParserTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/parse/JsonConfigParserTest.java index a9ede70d3530b4b446201d8e0f1bea8a29a45075..44da0521e9bc030946879feb3aac13392337b959 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/parse/JsonConfigParserTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/parse/JsonConfigParserTest.java @@ -43,7 +43,7 @@ public class JsonConfigParserTest { JsonConfigParser parser = new JsonConfigParser(); Map result = parser.doParse(content); - Assertions.assertEquals("dtpExecutor1", result.get("spring.dynamic.tp.executors[0].threadPoolName").toString()); + Assertions.assertEquals("dtpExecutor1", result.get("dynamictp.executors[0].threadPoolName").toString()); } } diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/parse/PropertiesConfigParserTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/parse/PropertiesConfigParserTest.java index c10b1a7a527ebfcf2172ac57b6491180e64eceb3..3536d8c0ff07b3731fe60b3c69d8f902f59900ca 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/parse/PropertiesConfigParserTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/parse/PropertiesConfigParserTest.java @@ -43,7 +43,7 @@ public class PropertiesConfigParserTest { PropertiesConfigParser parser = new PropertiesConfigParser(); Map result = parser.doParse(content); - Assertions.assertEquals("dtpExecutor1", result.get("spring.dynamic.tp.executors[0].threadPoolName").toString()); + Assertions.assertEquals("dtpExecutor1", result.get("dynamictp.executors[0].threadPoolName").toString()); } } diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/parse/YamlConfigParserTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/parse/YamlConfigParserTest.java index 0a050fee2fcbcc123a34828208a9a7dc2d74bd3a..a67bddc1fcf3afb6f691f81be84af03e602d5b0f 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/parse/YamlConfigParserTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/parse/YamlConfigParserTest.java @@ -43,6 +43,7 @@ class YamlConfigParserTest { YamlConfigParser parser = new YamlConfigParser(); Map result = parser.doParse(content); - Assertions.assertEquals("dtpExecutor1", result.get("spring.dynamic.tp.executors[0].threadPoolName").toString()); + + Assertions.assertEquals("dtpExecutor1", result.get("dynamictp.executors[0].threadPoolName").toString()); } } diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/AInterceptorTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/plugin/AInterceptorTest.java similarity index 82% rename from test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/AInterceptorTest.java rename to test/test-core/src/test/java/org/dromara/dynamictp/test/core/plugin/AInterceptorTest.java index ad617eb3cc7918482659767f271a4244090fb8d6..93d50634196cf82d7034f9e24018320878b96380 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/AInterceptorTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/plugin/AInterceptorTest.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.dromara.dynamictp.test.core.thread; +package org.dromara.dynamictp.test.core.plugin; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.plugin.DtpInterceptor; @@ -45,17 +45,20 @@ public class AInterceptorTest implements DtpInterceptor { @Override public Object intercept(DtpInvocation invocation) throws Throwable { String method = invocation.getMethod().getName(); - Object[] args = invocation.getArgs(); - if (BEFORE_EXECUTE.equals(method)) { - log.info("beforeExecute代理"); - } else if (AFTER_EXECUTE.equals(method)) { - log.info("afterExecute代理"); - } else if ("execute".equals(method)) { - log.info("execute代理"); + switch (method) { + case BEFORE_EXECUTE: + log.info("beforeExecute代理"); + break; + case AFTER_EXECUTE: + log.info("afterExecute代理"); + break; + case "execute": + log.info("execute代理"); + break; + default: + break; } - return invocation.proceed(); } - } diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/InterceptTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/plugin/InterceptTest.java similarity index 77% rename from test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/InterceptTest.java rename to test/test-core/src/test/java/org/dromara/dynamictp/test/core/plugin/InterceptTest.java index ca366388e3a9cb759ae4c6ff61fae6098a7e414b..d37b8d9bb39eb364180192251d74f6ba5336656a 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/InterceptTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/plugin/InterceptTest.java @@ -15,11 +15,12 @@ * limitations under the License. */ -package org.dromara.dynamictp.test.core.thread; +package org.dromara.dynamictp.test.core.plugin; import cn.hutool.core.collection.CollectionUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.plugin.DtpInterceptorRegistry; +import org.junit.Assert; import org.junit.Test; /** @@ -49,10 +50,16 @@ public class InterceptTest { @Test public void test() { - AInterceptorTest AInterceptorTest = new AInterceptorTest(); - DtpInterceptorRegistry.register("TestAInterceptor", AInterceptorTest); + AInterceptorTest interceptorTest = new AInterceptorTest(); + DtpInterceptorRegistry.register("TestAInterceptor", interceptorTest); + TestA testA = new TestA(); TestA testA1 = (TestA) DtpInterceptorRegistry.plugin(testA, CollectionUtil.newHashSet("TestAInterceptor")); + + Assert.assertTrue(testA1.getClass().getSimpleName().startsWith("InterceptTest$TestA$ByteBuddy$")); + Assert.assertTrue(testA.getClass().isAssignableFrom(testA1.getClass())); testA1.execute(); + testA1.beforeExecute(); + testA1.afterExecute(); } } diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/refresher/AbstractRefresherTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/refresher/AbstractRefresherTest.java new file mode 100644 index 0000000000000000000000000000000000000000..c5b30be4214129eaf34eae2132d2715d29142bcc --- /dev/null +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/refresher/AbstractRefresherTest.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.test.core.refresher; + +import org.dromara.dynamictp.common.properties.DtpProperties; +import org.dromara.dynamictp.common.em.ConfigFileTypeEnum; +import org.dromara.dynamictp.core.refresher.AbstractRefresher; +import org.junit.Before; +import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.runner.RunWith; +import org.mockito.Mockito; + +import org.springframework.test.context.junit4.SpringRunner; + +/** + * AbstractRefresherTest related + * + * @author vzer200 + * @since 1.1.8 + */ +@RunWith(SpringRunner.class) +public class AbstractRefresherTest { + private AbstractRefresher refresher; + private DtpProperties dtpProperties; + + @Before + public void setUp(){ + dtpProperties = DtpProperties.getInstance(); + refresher = Mockito.spy(new AbstractRefresher(dtpProperties) { + @Override + protected void doRefresh(DtpProperties properties) { + } + }); + } + + @Test + public void testRefresh(){ + String initialEnv = dtpProperties.getEnv(); + System.out.println("Initial env: " + initialEnv); + + mockConfigChange(); + + String refreshedEnv = dtpProperties.getEnv(); + System.out.println("Refreshed env: " + refreshedEnv); + Assertions.assertEquals("newEnvValue", refreshedEnv); + } + + private void mockConfigChange() { + String content = + "dynamictp:\n" + + " enabled: true\n" + + " env: newEnvValue"; + + refresher.refresh(content, ConfigFileTypeEnum.YAML); + } +} + diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/Config.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/Config.java index 1e2be72d32f470d79b191e42faa0040399c27536..972552a9eaebf0d5b1ab5001049dc7b45ed4a86c 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/Config.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/Config.java @@ -17,8 +17,8 @@ package org.dromara.dynamictp.test.core.spring; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; import org.dromara.dynamictp.core.support.DynamicTp; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/DtpBaseBeanConfigurationTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/DtpBaseBeanConfigurationTest.java index 48c205251c1e159d971d568afff5e32ca20d9712..ba275799fd5d6a3021951cadb21d06792d0ce148 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/DtpBaseBeanConfigurationTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/DtpBaseBeanConfigurationTest.java @@ -17,15 +17,16 @@ package org.dromara.dynamictp.test.core.spring; -import org.dromara.dynamictp.common.spring.ApplicationContextHolder; import org.dromara.dynamictp.core.DtpRegistry; import org.dromara.dynamictp.core.monitor.DtpMonitor; -import org.dromara.dynamictp.core.spring.DtpBaseBeanConfiguration; -import org.dromara.dynamictp.core.spring.DtpPostProcessor; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; -import org.dromara.dynamictp.core.spring.YamlPropertySourceFactory; import org.dromara.dynamictp.core.support.DtpBannerPrinter; +import org.dromara.dynamictp.spring.DtpBaseBeanConfiguration; +import org.dromara.dynamictp.spring.DtpPostProcessor; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; +import org.dromara.dynamictp.spring.holder.SpringContextHolder; +import org.dromara.dynamictp.spring.support.YamlPropertySourceFactory; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; @@ -43,9 +44,10 @@ import org.springframework.context.annotation.PropertySource; @SpringBootTest(classes = DtpBaseBeanConfigurationTest.class) public class DtpBaseBeanConfigurationTest { + @Nested @SpringBootTest(classes = DtpBaseBeanConfigurationTest.class) @EnableDynamicTp - public static class EnableDynamicTpAnnotationTest { + class EnableDynamicTpAnnotationTest { @Autowired private ApplicationContext applicationContext; @@ -53,7 +55,7 @@ public class DtpBaseBeanConfigurationTest { @Test void test() { Assertions.assertNotNull(applicationContext.getBean(DtpBaseBeanConfiguration.class)); - Assertions.assertNotNull(applicationContext.getBean(ApplicationContextHolder.class)); + Assertions.assertNotNull(applicationContext.getBean(SpringContextHolder.class)); Assertions.assertNotNull(applicationContext.getBean(DtpBannerPrinter.class)); Assertions.assertNotNull(applicationContext.getBean(DtpPostProcessor.class)); Assertions.assertNotNull(applicationContext.getBean(DtpRegistry.class)); @@ -62,8 +64,9 @@ public class DtpBaseBeanConfigurationTest { } + @Nested @SpringBootTest(classes = DtpBaseBeanConfigurationTest.class) - public static class DisableDynamicTpAnnotationTest { + class DisableDynamicTpAnnotationTest { @Autowired private ApplicationContext applicationContext; @@ -71,7 +74,7 @@ public class DtpBaseBeanConfigurationTest { @Test void test() { Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> applicationContext.getBean(DtpBaseBeanConfiguration.class)); - Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> applicationContext.getBean(ApplicationContextHolder.class)); + Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> applicationContext.getBean(SpringContextHolder.class)); Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> applicationContext.getBean(DtpBannerPrinter.class)); Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> applicationContext.getBean(DtpPostProcessor.class)); Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> applicationContext.getBean(DtpRegistry.class)); diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/DtpLifecycleSpringAdapterTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/DtpLifecycleSpringAdapterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..717db78bba5c9fcbf8b568e20f3caf34bf062df3 --- /dev/null +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/DtpLifecycleSpringAdapterTest.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.test.core.spring; + +import org.dromara.dynamictp.core.lifecycle.LifeCycleManagement; +import org.dromara.dynamictp.spring.lifecycle.DtpLifecycleSpringAdapter; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; + +/** + * DtpLifecycleSpringAdapterTest related + * + * @author vzer200 + * @since 1.1.8 + */ +@SpringBootTest(classes = DtpLifecycleSpringAdapterTest.TestConfig.class) +class DtpLifecycleSpringAdapterTest { + + @Autowired + private ApplicationContext applicationContext; + + @Autowired + private DtpLifecycleSpringAdapter dtpLifecycleSpringAdapter; + + @Autowired + private LifeCycleManagement lifeCycleManagement; + + @Test + void testLifecycleManagementIntegration() { + // 验证 DtpLifecycleSpringAdapter 和 LifeCycleManagement 是否注入成功 + Assertions.assertNotNull(dtpLifecycleSpringAdapter); + Assertions.assertNotNull(lifeCycleManagement); + + // 启动 lifecycle 并检查状态 + dtpLifecycleSpringAdapter.start(); + Assertions.assertTrue(dtpLifecycleSpringAdapter.isRunning()); + Mockito.verify(lifeCycleManagement).start(); + Mockito.when(lifeCycleManagement.isRunning()).thenReturn(true); // Mock isRunning() 状态同步 + Assertions.assertTrue(lifeCycleManagement.isRunning()); + + Mockito.reset(lifeCycleManagement); + + // 停止 lifecycle 并检查状态 + dtpLifecycleSpringAdapter.stop(); + Assertions.assertFalse(dtpLifecycleSpringAdapter.isRunning()); + Mockito.verify(lifeCycleManagement).stop(); + Mockito.when(lifeCycleManagement.isRunning()).thenReturn(false); // Mock isRunning() 状态同步 + Assertions.assertFalse(lifeCycleManagement.isRunning()); + } + + @Test + void testAutoStartupAndPhase() { + // 验证 isAutoStartup 和 getPhase 方法的行为 + Mockito.when(lifeCycleManagement.isAutoStartup()).thenReturn(true); // Mock 返回值为 true + Mockito.when(lifeCycleManagement.getPhase()).thenReturn(0); // Mock 返回值为 int 类型 0 + Assertions.assertEquals(lifeCycleManagement.isAutoStartup(), dtpLifecycleSpringAdapter.isAutoStartup()); + Assertions.assertEquals(lifeCycleManagement.getPhase(), dtpLifecycleSpringAdapter.getPhase()); + } + + @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan(basePackages = "org.dromara.dynamictp.test.core.spring") + public static class TestConfig { + @Bean + public LifeCycleManagement lifeCycleManagement() { + return Mockito.mock(LifeCycleManagement.class); + } + + @Bean(name = "testDtpLifecycleSpringAdapter") + public DtpLifecycleSpringAdapter dtpLifecycleSpringAdapter(LifeCycleManagement lifeCycleManagement) { + return new DtpLifecycleSpringAdapter(lifeCycleManagement); + } + } +} + + diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/DtpPostProcessorTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/DtpPostProcessorTest.java index eebf2c16dd5f7acfa2924ef5bb114a0d9012b16d..1abdaa42842e4cfea4439a7cbd6f3a0ce5b15867 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/DtpPostProcessorTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/DtpPostProcessorTest.java @@ -18,14 +18,14 @@ package org.dromara.dynamictp.test.core.spring; import org.dromara.dynamictp.core.DtpRegistry; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; -import org.dromara.dynamictp.core.spring.YamlPropertySourceFactory; -import org.dromara.dynamictp.core.support.ThreadPoolExecutorProxy; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; +import org.dromara.dynamictp.spring.support.YamlPropertySourceFactory; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.springframework.boot.SpringApplication; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.PropertySource; @@ -41,14 +41,11 @@ import java.util.concurrent.ThreadPoolExecutor; @EnableAutoConfiguration @PropertySource(value = "classpath:/postprocessor-dtp-dev.yml", factory = YamlPropertySourceFactory.class) @ComponentScan(basePackages = "org.dromara.dynamictp.test.core.spring") -public class DtpPostProcessorTest { +@SpringBootTest(classes = DtpPostProcessorTest.class) +class DtpPostProcessorTest { - private static ConfigurableApplicationContext context; - - @BeforeAll - public static void setUp() { - context = SpringApplication.run(DtpPostProcessorTest.class); - } + @Autowired + private ConfigurableApplicationContext context; @Test void test() { @@ -56,11 +53,11 @@ public class DtpPostProcessorTest { Assertions.assertNotNull(executor); Executor commonExecutor = context.getBean("commonExecutor", ThreadPoolExecutor.class); - Assertions.assertEquals(commonExecutor.getClass(), ThreadPoolExecutorProxy.class); + Assertions.assertEquals(ThreadPoolExecutorProxy.class, commonExecutor.getClass()); commonExecutor.execute(() -> System.out.println("enhance commonExecutor success!")); ThreadPoolTaskExecutor taskExecutor = context.getBean("taskExecutor", ThreadPoolTaskExecutor.class); - Assertions.assertEquals(taskExecutor.getThreadPoolExecutor().getClass(), ThreadPoolExecutorProxy.class); + Assertions.assertEquals(ThreadPoolExecutorProxy.class, taskExecutor.getThreadPoolExecutor().getClass()); taskExecutor.execute(() -> System.out.println("enhance taskExecutor success!")); } diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/PropertiesBinderTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/PropertiesBinderTest.java index a8764de7581c3208d96675a824ef843616b51820..12d4a90cf0a74d079bcb422427be9e7605ae135b 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/PropertiesBinderTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/spring/PropertiesBinderTest.java @@ -15,15 +15,18 @@ * limitations under the License. */ + package org.dromara.dynamictp.test.core.spring; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.dromara.dynamictp.common.properties.DtpProperties; -import org.dromara.dynamictp.core.spring.YamlPropertySourceFactory; -import org.dromara.dynamictp.core.support.BinderHelper; +import org.dromara.dynamictp.core.support.binder.BinderHelper; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; +import org.dromara.dynamictp.spring.support.YamlPropertySourceFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; @@ -43,32 +46,52 @@ import java.util.Map; factory = YamlPropertySourceFactory.class) @SpringBootTest(classes = PropertiesBinderTest.class) @EnableAutoConfiguration +@EnableDynamicTp +@TestInstance(TestInstance.Lifecycle.PER_CLASS) // 使用同一个实例运行所有测试 class PropertiesBinderTest { @Autowired private AbstractEnvironment environment; @Test - void testBindDtpPropertiesWithMap() { - Map properties = Maps.newHashMap(); - properties.put("spring.dynamic.tp.enabled", false); - properties.put("spring.dynamic.tp.collectorTypes", Lists.newArrayList("LOGGING")); - properties.put("spring.dynamic.tp.executors[0].threadPoolName", "test_dtp"); + void testBindDtpPropertiesWithMap() throws Exception { + try { + Map properties = Maps.newHashMap(); + properties.put("dynamictp.enabled", false); + properties.put("dynamictp.collectorTypes", Lists.newArrayList("LOGGING")); + properties.put("dynamictp.executors[0].threadPoolName", "test_dtp"); + properties.put("dynamictp.executors[1].threadPoolName", "test_dtp1"); + properties.put("dynamictp.executors[0].executorType", "common"); + properties.put("dynamictp.globalExecutorProps.executorType", "eager"); - DtpProperties dtpProperties = DtpProperties.getInstance(); - BinderHelper.bindDtpProperties(properties, dtpProperties); - Assertions.assertEquals(properties.get("spring.dynamic.tp.executors[0].threadPoolName"), - dtpProperties.getExecutors().get(0).getThreadPoolName()); - Assertions.assertIterableEquals((List) properties.get("spring.dynamic.tp.collectorTypes"), - dtpProperties.getCollectorTypes()); + DtpProperties dtpProperties = DtpProperties.getInstance(); + System.out.println("Collector Types before binding: " + dtpProperties.getCollectorTypes()); + BinderHelper.bindDtpProperties(properties, dtpProperties); + System.out.println("Collector Types after binding: " + dtpProperties.getCollectorTypes()); + + Assertions.assertEquals(properties.get("dynamictp.executors[0].threadPoolName"), + dtpProperties.getExecutors().get(0).getThreadPoolName()); + Assertions.assertIterableEquals((List) properties.get("dynamictp.collectorTypes"), + dtpProperties.getCollectorTypes()); + Assertions.assertEquals("common", + dtpProperties.getExecutors().get(0).getExecutorType()); + Assertions.assertEquals(properties.get("dynamictp.globalExecutorProps.executorType"), + dtpProperties.getExecutors().get(1).getExecutorType()); + + } catch (Exception e) { + throw new RuntimeException("Failed to reset DtpProperties instance", e); + } } @Test void testBindDtpPropertiesWithEnvironment() { DtpProperties dtpProperties = DtpProperties.getInstance(); BinderHelper.bindDtpProperties(environment, dtpProperties); - String threadPoolName = environment.getProperty("spring.dynamic.tp.executors[0].threadPoolName"); + String threadPoolName = environment.getProperty("dynamictp.executors[0].threadPoolName"); Assertions.assertEquals(threadPoolName, dtpProperties.getExecutors().get(0).getThreadPoolName()); + String executorType = environment.getProperty("dynamictp.globalExecutorProps.executorType"); + Assertions.assertEquals(executorType, dtpProperties.getExecutors().get(1).getExecutorType()); + } } diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/support/proxy/ThreadPoolExecutorProxyTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/support/proxy/ThreadPoolExecutorProxyTest.java new file mode 100644 index 0000000000000000000000000000000000000000..df9a1cc8ccab81c8a624a318dbc65672a54a56d1 --- /dev/null +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/support/proxy/ThreadPoolExecutorProxyTest.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.test.core.support.proxy; + +import org.dromara.dynamictp.core.executor.NamedThreadFactory; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; +import org.junit.Assert; +import org.junit.Test; + +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @author devin + */ +public class ThreadPoolExecutorProxyTest { + + @Test + public void testParametersAndStatus() throws InterruptedException { + ThreadPoolExecutor executor = new ThreadPoolExecutor( + 5, 10, 60, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(100), + new NamedThreadFactory("ThriftTestPool")); + + ThreadPoolExecutorProxy proxy = new ThreadPoolExecutorProxy(executor); + + Assert.assertEquals(executor.getCorePoolSize(), proxy.getCorePoolSize()); + Assert.assertEquals(executor.getMaximumPoolSize(), proxy.getMaximumPoolSize()); + Assert.assertEquals(executor.getCompletedTaskCount(), proxy.getCompletedTaskCount()); + Assert.assertEquals(executor.getLargestPoolSize(), proxy.getLargestPoolSize()); + Assert.assertEquals(executor.getThreadFactory(), proxy.getThreadFactory()); + Assert.assertEquals(executor.getKeepAliveTime(TimeUnit.SECONDS), proxy.getKeepAliveTime(TimeUnit.SECONDS)); + Assert.assertEquals(executor.getQueue(), proxy.getQueue()); + Assert.assertEquals(executor.allowsCoreThreadTimeOut(), proxy.allowsCoreThreadTimeOut()); + + proxy.setCorePoolSize(6); + Assert.assertEquals(6, proxy.getCorePoolSize()); + + proxy.setMaximumPoolSize(12); + Assert.assertEquals(12, proxy.getMaximumPoolSize()); + + proxy.setKeepAliveTime(120, TimeUnit.SECONDS); + Assert.assertEquals(120, proxy.getKeepAliveTime(TimeUnit.SECONDS)); + + executor.shutdown(); + Thread.sleep(1000); + Assert.assertTrue(executor.isShutdown()); + } +} diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/DtpExecutorTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/DtpExecutorTest.java index 01e49aa6c33566b32363f82f982d44e1b3f31e04..afac8d175a742879cb2c43afc11bf9ffa9c8e854 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/DtpExecutorTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/DtpExecutorTest.java @@ -20,9 +20,9 @@ package org.dromara.dynamictp.test.core.thread; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.core.DtpRegistry; import org.dromara.dynamictp.core.notifier.manager.AlarmManager; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; -import org.dromara.dynamictp.core.spring.YamlPropertySourceFactory; import org.dromara.dynamictp.core.support.ExecutorWrapper; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; +import org.dromara.dynamictp.spring.support.YamlPropertySourceFactory; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/EagerDtpExecutorTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/EagerDtpExecutorTest.java index 0e12a235fa4cb46648f69b049a89150355832192..a7b029f5f04e38dc6f6ec2abd935d27b14bdd7eb 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/EagerDtpExecutorTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/EagerDtpExecutorTest.java @@ -19,8 +19,8 @@ package org.dromara.dynamictp.test.core.thread; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.core.DtpRegistry; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; -import org.dromara.dynamictp.core.spring.YamlPropertySourceFactory; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; +import org.dromara.dynamictp.spring.support.YamlPropertySourceFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/OrderedDtpExecutorTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/OrderedDtpExecutorTest.java index 5443e3fb4e425f80fa400b8be627084108d953a6..5e55af624b16c63b7d8526f2c5c5509e3f5bb4be 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/OrderedDtpExecutorTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/OrderedDtpExecutorTest.java @@ -18,15 +18,16 @@ package org.dromara.dynamictp.test.core.thread; import com.alibaba.ttl.TransmittableThreadLocal; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; -import org.dromara.dynamictp.core.spring.YamlPropertySourceFactory; -import org.dromara.dynamictp.core.support.task.Ordered; -import org.dromara.dynamictp.core.support.task.callable.OrderedCallable; -import org.dromara.dynamictp.core.executor.OrderedDtpExecutor; import com.google.common.collect.Lists; import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.slf4j.Slf4j; +import org.dromara.dynamictp.core.DtpRegistry; +import org.dromara.dynamictp.core.executor.OrderedDtpExecutor; +import org.dromara.dynamictp.core.support.task.Ordered; +import org.dromara.dynamictp.core.support.task.callable.OrderedCallable; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; +import org.dromara.dynamictp.spring.support.YamlPropertySourceFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.MDC; @@ -35,7 +36,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.PropertySource; import org.springframework.test.context.junit.jupiter.SpringExtension; -import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; @@ -43,22 +43,23 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; @Slf4j -@PropertySource(value = "classpath:/dynamic-tp-nacos-demo-dtp-dev.yml", factory = YamlPropertySourceFactory.class) @SpringBootTest(classes = OrderedDtpExecutorTest.class) @ExtendWith(SpringExtension.class) @EnableDynamicTp @EnableAutoConfiguration +@PropertySource(value = "classpath:/dynamic-tp-nacos-demo-dtp-dev.yml", factory = YamlPropertySourceFactory.class) class OrderedDtpExecutorTest { - @Resource - private OrderedDtpExecutor orderedDtpExecutor; - private final TransmittableThreadLocal threadLocal = new TransmittableThreadLocal<>(); private final List TABLES = Lists.newArrayList("table1", "table2", "table3"); @Test void orderedExecute() throws InterruptedException { + OrderedDtpExecutor orderedDtpExecutor = (OrderedDtpExecutor) DtpRegistry.getExecutor("orderedDtpExecutor"); + if (orderedDtpExecutor == null) { + return; + } for (int i = 0; i < 1000; i++) { if (i == 500) { TimeUnit.MILLISECONDS.sleep(2000L); @@ -71,6 +72,10 @@ class OrderedDtpExecutorTest { @Test void orderedSubmit() { + OrderedDtpExecutor orderedDtpExecutor = (OrderedDtpExecutor) DtpRegistry.getExecutor("orderedDtpExecutor"); + if (orderedDtpExecutor == null) { + return; + } List> futures = new ArrayList<>(); for (int i = 0; i < 100; i++) { threadLocal.set("ttl" + i); diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/PriorityDtpExecutorTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/PriorityDtpExecutorTest.java index 52d4edf654f902ae0a0bcd495d03908cfefc997c..9fd72c693b6bbe45d750644b6d12538d13e8e5be 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/PriorityDtpExecutorTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/PriorityDtpExecutorTest.java @@ -19,8 +19,8 @@ package org.dromara.dynamictp.test.core.thread; import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.core.executor.priority.PriorityDtpExecutor; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; -import org.dromara.dynamictp.core.spring.YamlPropertySourceFactory; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; +import org.dromara.dynamictp.spring.support.YamlPropertySourceFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -41,8 +41,8 @@ import java.util.concurrent.TimeUnit; * @author KamTo Hung */ @Slf4j -@EnableDynamicTp @EnableAutoConfiguration +@EnableDynamicTp @ExtendWith(SpringExtension.class) @SpringBootTest(classes = PriorityDtpExecutorTest.class) @PropertySource(value = "classpath:/dynamic-tp-demo.yml", factory = YamlPropertySourceFactory.class) diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/ScheduledDtpExecutorTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/ScheduledDtpExecutorTest.java index 3839203b004b4384f9e608efa356da0994502a17..fd9d2f9460e5e7d0f8f05905c7485a720748c4a9 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/ScheduledDtpExecutorTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/ScheduledDtpExecutorTest.java @@ -18,9 +18,9 @@ package org.dromara.dynamictp.test.core.thread; import org.dromara.dynamictp.core.DtpRegistry; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; -import org.dromara.dynamictp.core.spring.YamlPropertySourceFactory; import org.dromara.dynamictp.core.executor.ScheduledDtpExecutor; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; +import org.dromara.dynamictp.spring.support.YamlPropertySourceFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -29,6 +29,7 @@ import org.springframework.context.annotation.PropertySource; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.time.LocalDateTime; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @PropertySource(value = "classpath:/dynamic-tp-nacos-demo-dtp-dev.yml", factory = YamlPropertySourceFactory.class) @@ -67,4 +68,14 @@ class ScheduledDtpExecutorTest { dtpExecutor14.shutdownNow(); } + @Test + void testScheduleCancel() { + ScheduledDtpExecutor dtpExecutor12 = (ScheduledDtpExecutor) DtpRegistry.getExecutor("dtpExecutor12"); + ScheduledFuture scheduledFuture = dtpExecutor12.scheduleWithFixedDelay(() -> { + System.out.println(Thread.currentThread().getName() + "进来了," + + "当前时间是 "); + }, 0, 1000, TimeUnit.MILLISECONDS); + scheduledFuture.cancel(false); + } + } diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/proxy/ThreadPoolExecutorProxyTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/proxy/ThreadPoolExecutorProxyTest.java index 2a3d1a88f847dae3f79319704d7ee1c42694ed61..d674a6b09174f4e2d2fb043695188e72a40f41a4 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/proxy/ThreadPoolExecutorProxyTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/proxy/ThreadPoolExecutorProxyTest.java @@ -21,9 +21,9 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.dynamictp.common.entity.TpExecutorProps; import org.dromara.dynamictp.core.aware.AwareManager; import org.dromara.dynamictp.core.executor.NamedThreadFactory; -import org.dromara.dynamictp.core.spring.EnableDynamicTp; import org.dromara.dynamictp.core.support.ExecutorWrapper; -import org.dromara.dynamictp.core.support.ThreadPoolExecutorProxy; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/proxy/ThreadPoolExecutorTest.java b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/proxy/ThreadPoolExecutorTest.java index 13670ae37be04a0f3875fcb48bc3f2caf6bcef87..7c419d5b467a76931671b2a574906c604ad7a69b 100644 --- a/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/proxy/ThreadPoolExecutorTest.java +++ b/test/test-core/src/test/java/org/dromara/dynamictp/test/core/thread/proxy/ThreadPoolExecutorTest.java @@ -18,7 +18,7 @@ package org.dromara.dynamictp.test.core.thread.proxy; import org.dromara.dynamictp.core.executor.NamedThreadFactory; -import org.dromara.dynamictp.core.support.ThreadPoolExecutorProxy; +import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; import org.junit.Assert; import org.junit.Test; @@ -30,7 +30,6 @@ import java.util.concurrent.TimeUnit; * @author hanli * @date 2023年09月15日 09:48 */ - public class ThreadPoolExecutorTest { @Test diff --git a/test/test-core/src/test/resources/META-INF/services/org.dromara.dynamictp.common.notifier.type.AbstractCustomAlarmType b/test/test-core/src/test/resources/META-INF/services/org.dromara.dynamictp.common.notifier.type.AbstractCustomAlarmType new file mode 100644 index 0000000000000000000000000000000000000000..47bec92a0c81c4cb6a7867c98b2f49d9873ccd88 --- /dev/null +++ b/test/test-core/src/test/resources/META-INF/services/org.dromara.dynamictp.common.notifier.type.AbstractCustomAlarmType @@ -0,0 +1 @@ +org.dromara.dynamictp.test.core.notify.customalarmtype.MyAlarmType \ No newline at end of file diff --git a/test/test-core/src/test/resources/META-INF/spring.factories b/test/test-core/src/test/resources/META-INF/spring.factories new file mode 100644 index 0000000000000000000000000000000000000000..a753c9a837b957c5161d62c2f8db50fbd3e19d1e --- /dev/null +++ b/test/test-core/src/test/resources/META-INF/spring.factories @@ -0,0 +1,4 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +org.dromara.dynamictp.spring.DtpBaseBeanConfiguration,\ +org.dromara.dynamictp.spring.annotation.DtpBaseBeanDefinitionRegistrar,\ +org.dromara.dynamictp.spring.annotation.DtpBeanDefinitionRegistrar diff --git a/test/test-core/src/test/resources/demo-dtp-dev.properties b/test/test-core/src/test/resources/demo-dtp-dev.properties index d4ce5a9dbed196d18898f7dc33c07627fe110306..a92c700b430c52ed64cde10f0081ec2b7c208a9e 100644 --- a/test/test-core/src/test/resources/demo-dtp-dev.properties +++ b/test/test-core/src/test/resources/demo-dtp-dev.properties @@ -1,72 +1,72 @@ -spring.dynamic.tp.enabled=true -spring.dynamic.tp.enabledBanner=true -spring.dynamic.tp.enabledCollect=true -spring.dynamic.tp.collectorTypes=micrometer,logging -spring.dynamic.tp.logPath=/home/logs -spring.dynamic.tp.monitorInterval=5 -spring.dynamic.tp.platforms[0].platform=wechat -spring.dynamic.tp.platforms[0].urlKey=3a7500-1287-4bd-a798-c5c3d8b69c -spring.dynamic.tp.platforms[0].receivers=test1,test2 -spring.dynamic.tp.platforms[1].platform=ding -spring.dynamic.tp.platforms[1].urlKey=f80dad441fcd655438f4a08dcd6a -spring.dynamic.tp.platforms[1].secret=SECb5441fa6f375d5b9d21 -spring.dynamic.tp.platforms[1].receivers=15810119805 -spring.dynamic.tp.platforms[2].platform=lark -spring.dynamic.tp.platforms[2].urlKey=0d944ae7-b24a-40 -spring.dynamic.tp.platforms[2].receivers=test1,test2 -spring.dynamic.tp.tomcatTp.corePoolSize=100 -spring.dynamic.tp.tomcatTp.maximumPoolSize=400 -spring.dynamic.tp.tomcatTp.keepAliveTime=60 -spring.dynamic.tp.jettyTp.corePoolSize=100 -spring.dynamic.tp.jettyTp.maximumPoolSize=400 -spring.dynamic.tp.undertowTp.corePoolSize=100 -spring.dynamic.tp.undertowTp.maximumPoolSize=400 -spring.dynamic.tp.undertowTp.keepAliveTime=60 -spring.dynamic.tp.hystrixTp[0].threadPoolName=hystrix1 -spring.dynamic.tp.hystrixTp[0].corePoolSize=100 -spring.dynamic.tp.hystrixTp[0].maximumPoolSize=400 -spring.dynamic.tp.hystrixTp[0].keepAliveTime=60 -spring.dynamic.tp.dubboTp[0].threadPoolName=dubboTp#20880 -spring.dynamic.tp.dubboTp[0].corePoolSize=100 -spring.dynamic.tp.dubboTp[0].maximumPoolSize=400 -spring.dynamic.tp.dubboTp[0].keepAliveTime=60 -spring.dynamic.tp.rocketMqTp[0].threadPoolName=group1#topic1 -spring.dynamic.tp.rocketMqTp[0].corePoolSize=200 -spring.dynamic.tp.rocketMqTp[0].maximumPoolSize=400 -spring.dynamic.tp.rocketMqTp[0].keepAliveTime=60 -spring.dynamic.tp.executors[0].threadPoolName=dtpExecutor1 -spring.dynamic.tp.executors[0].executorType=common -spring.dynamic.tp.executors[0].corePoolSize=6 -spring.dynamic.tp.executors[0].maximumPoolSize=8 -spring.dynamic.tp.executors[0].queueCapacity=200 -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=test -spring.dynamic.tp.executors[0].waitForTasksToCompleteOnShutdown=false -spring.dynamic.tp.executors[0].awaitTerminationSeconds=5 -spring.dynamic.tp.executors[0].preStartAllCoreThreads=false -spring.dynamic.tp.executors[0].runTimeout=200 -spring.dynamic.tp.executors[0].queueTimeout=100 -spring.dynamic.tp.executors[0].taskWrapperNames[0]=ttl -spring.dynamic.tp.executors[0].notifyItems[0].type=capacity -spring.dynamic.tp.executors[0].notifyItems[0].enabled=true -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=true -spring.dynamic.tp.executors[0].notifyItems[2].type=liveness -spring.dynamic.tp.executors[0].notifyItems[2].enabled=true -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=true -spring.dynamic.tp.executors[0].notifyItems[3].threshold=1 -spring.dynamic.tp.executors[0].notifyItems[4].type=run_timeout -spring.dynamic.tp.executors[0].notifyItems[4].enabled=true -spring.dynamic.tp.executors[0].notifyItems[4].threshold=1 -spring.dynamic.tp.executors[0].notifyItems[5].type=queue_timeout -spring.dynamic.tp.executors[0].notifyItems[5].enabled=true -spring.dynamic.tp.executors[0].notifyItems[5].threshold=1 +dynamictp.enabled=true +dynamictp.enabledBanner=true +dynamictp.enabledCollect=true +dynamictp.collectorTypes=micrometer,logging +dynamictp.logPath=/home/logs +dynamictp.monitorInterval=5 +dynamictp.platforms[0].platform=wechat +dynamictp.platforms[0].urlKey=3a7500-1287-4bd-a798-c5c3d8b69c +dynamictp.platforms[0].receivers=test1,test2 +dynamictp.platforms[1].platform=ding +dynamictp.platforms[1].urlKey=f80dad441fcd655438f4a08dcd6a +dynamictp.platforms[1].secret=SECb5441fa6f375d5b9d21 +dynamictp.platforms[1].receivers=15810119805 +dynamictp.platforms[2].platform=lark +dynamictp.platforms[2].urlKey=0d944ae7-b24a-40 +dynamictp.platforms[2].receivers=test1,test2 +dynamictp.tomcatTp.corePoolSize=100 +dynamictp.tomcatTp.maximumPoolSize=400 +dynamictp.tomcatTp.keepAliveTime=60 +dynamictp.jettyTp.corePoolSize=100 +dynamictp.jettyTp.maximumPoolSize=400 +dynamictp.undertowTp.corePoolSize=100 +dynamictp.undertowTp.maximumPoolSize=400 +dynamictp.undertowTp.keepAliveTime=60 +dynamictp.hystrixTp[0].threadPoolName=hystrix1 +dynamictp.hystrixTp[0].corePoolSize=100 +dynamictp.hystrixTp[0].maximumPoolSize=400 +dynamictp.hystrixTp[0].keepAliveTime=60 +dynamictp.dubboTp[0].threadPoolName=dubboTp#20880 +dynamictp.dubboTp[0].corePoolSize=100 +dynamictp.dubboTp[0].maximumPoolSize=400 +dynamictp.dubboTp[0].keepAliveTime=60 +dynamictp.rocketMqTp[0].threadPoolName=group1#topic1 +dynamictp.rocketMqTp[0].corePoolSize=200 +dynamictp.rocketMqTp[0].maximumPoolSize=400 +dynamictp.rocketMqTp[0].keepAliveTime=60 +dynamictp.executors[0].threadPoolName=dtpExecutor1 +dynamictp.executors[0].executorType=common +dynamictp.executors[0].corePoolSize=6 +dynamictp.executors[0].maximumPoolSize=8 +dynamictp.executors[0].queueCapacity=200 +dynamictp.executors[0].queueType=VariableLinkedBlockingQueue +dynamictp.executors[0].rejectedHandlerType=CallerRunsPolicy +dynamictp.executors[0].keepAliveTime=50 +dynamictp.executors[0].allowCoreThreadTimeOut=false +dynamictp.executors[0].threadNamePrefix=test +dynamictp.executors[0].waitForTasksToCompleteOnShutdown=false +dynamictp.executors[0].awaitTerminationSeconds=5 +dynamictp.executors[0].preStartAllCoreThreads=false +dynamictp.executors[0].runTimeout=200 +dynamictp.executors[0].queueTimeout=100 +dynamictp.executors[0].taskWrapperNames[0]=ttl +dynamictp.executors[0].notifyItems[0].type=capacity +dynamictp.executors[0].notifyItems[0].enabled=true +dynamictp.executors[0].notifyItems[0].threshold=80 +dynamictp.executors[0].notifyItems[0].platforms[0]=ding +dynamictp.executors[0].notifyItems[0].platforms[1]=wechat +dynamictp.executors[0].notifyItems[0].interval=120 +dynamictp.executors[0].notifyItems[1].type=change +dynamictp.executors[0].notifyItems[1].enabled=true +dynamictp.executors[0].notifyItems[2].type=liveness +dynamictp.executors[0].notifyItems[2].enabled=true +dynamictp.executors[0].notifyItems[2].threshold=80 +dynamictp.executors[0].notifyItems[3].type=reject +dynamictp.executors[0].notifyItems[3].enabled=true +dynamictp.executors[0].notifyItems[3].threshold=1 +dynamictp.executors[0].notifyItems[4].type=run_timeout +dynamictp.executors[0].notifyItems[4].enabled=true +dynamictp.executors[0].notifyItems[4].threshold=1 +dynamictp.executors[0].notifyItems[5].type=queue_timeout +dynamictp.executors[0].notifyItems[5].enabled=true +dynamictp.executors[0].notifyItems[5].threshold=1 diff --git a/test/test-core/src/test/resources/demo-dtp-dev.yml b/test/test-core/src/test/resources/demo-dtp-dev.yml index 19aa09329a77e58b400ed5a6c7bc903433ee099f..8ca6254cddf30f4b39625e60a531b0c3f5a77323 100644 --- a/test/test-core/src/test/resources/demo-dtp-dev.yml +++ b/test/test-core/src/test/resources/demo-dtp-dev.yml @@ -1,84 +1,119 @@ # 动态线程池配置文件,建议单独开一个文件放到配置中心,字段详解看readme介绍 -spring: - dynamic: - tp: - enabled: true - enabledBanner: true # 是否开启banner打印,默认true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs - monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - tomcatTp: # tomcat web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - jettyTp: # jetty web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - undertowTp: # undertow web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - hystrixTp: # hystrix 线程池配置 - - threadPoolName: hystrix1 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - dubboTp: # dubbo 线程池配置 - - threadPoolName: dubboTp#20880 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - rocketMqTp: # rocketmq 线程池配置 - - threadPoolName: group1#topic1 - corePoolSize: 200 - maximumPoolSize: 400 - keepAliveTime: 60 - executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 - - threadPoolName: dtpExecutor1 - 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"] # 任务包装器名称,集成TaskWrapper接口 - 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 \ No newline at end of file +dynamictp: + enabled: true + enabledBanner: true # 是否开启banner打印,默认true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs- + monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + tomcatTp: # tomcat web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + jettyTp: # jetty web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + undertowTp: # undertow web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + hystrixTp: # hystrix 线程池配置 + - threadPoolName: hystrix1 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + dubboTp: # dubbo 线程池配置 + - threadPoolName: dubboTp#20880 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + rocketMqTp: # rocketmq 线程池配置 + - threadPoolName: group1#topic1 + corePoolSize: 200 + maximumPoolSize: 400 + keepAliveTime: 60 + - threadPoolName: group2#topic2 + maximumPoolSize: 200 + keepAliveTime: 60 + notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警) + - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 + enabled: true + threshold: 82 # 报警阈值 + platforms: [ ding,wechat ] # 可选配置,不配置默认拿上层platforms配置的所以平台 + interval: 120 # 报警间隔(单位:s) + + globalExecutorProps: + corePoolSize: 1 + waitForTasksToCompleteOnShutdown: false # 参考spring线程池设计,优雅关闭线程池 + awaitTerminationSeconds: 5 # 单位(s) + preStartAllCoreThreads: false # 是否预热所有核心线程,默认false + runTimeout: 201 # 任务执行超时阈值,目前只做告警用,单位(ms) + queueTimeout: 101 # 任务在队列等待超时阈值,目前只做告警用,单位(ms) + taskWrapperNames: [ "ttl" ] # 任务包装器名称,集成TaskWrapper接口 + notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警) + - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 + enabled: true + threshold: 81 # 报警阈值 + platforms: [ ding,wechat ] # 可选配置,不配置默认拿上层platforms配置的所以平台 + interval: 120 # 报警间隔(单位:s) + - type: change + enabled: true + - type: liveness + enabled: true + threshold: 80 + - type: reject + enabled: true + threshold: 1 + - type: queue_timeout + enabled: true + threshold: 1 + executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 + - threadPoolName: dtpExecutor1 + 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"] # 任务包装器名称,集成TaskWrapper接口 + 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 + - threadPoolName: dtpExecutor2 + maximumPoolSize: 18 \ No newline at end of file diff --git a/test/test-core/src/test/resources/dynamic-tp-demo.yml b/test/test-core/src/test/resources/dynamic-tp-demo.yml index 4596e712b9d75c8db2d1f5082a15819fcdbe67bc..6cdee78d8e4889a3898eaeb5bdd790c3cfac79ff 100644 --- a/test/test-core/src/test/resources/dynamic-tp-demo.yml +++ b/test/test-core/src/test/resources/dynamic-tp-demo.yml @@ -1,91 +1,139 @@ # 动态线程池配置文件,建议单独开一个文件放到配置中心,字段详解看readme介绍 -spring: - dynamic: - tp: - enabled: true - enabledBanner: true # 是否开启banner打印,默认true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: jmx,micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs - monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s - configType: yml # 配置文件类型 - executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 - - threadPoolName: testRunTimeoutDtpExecutor - executorType: common # 线程池类型common、eager:适用于io密集型 - corePoolSize: 1 - maximumPoolSize: 1 - queueCapacity: 500 - 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" ] # 任务包装器名称,集成TaskWrapper接口 - - threadPoolName: testQueueTimeoutDtpExecutor - executorType: common # 线程池类型common、eager:适用于io密集型 - corePoolSize: 1 - maximumPoolSize: 1 - queueCapacity: 500 - 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" ] # 任务包装器名称,集成TaskWrapper接口 - - threadPoolName: testRejectedQueueTimeoutCancelDtpExecutor - executorType: common # 线程池类型common、eager:适用于io密集型 - corePoolSize: 1 - maximumPoolSize: 1 - queueCapacity: 50 - 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" ] # 任务包装器名称,集成TaskWrapper接口 - - threadPoolName: eagerDtpThreadPoolExecutor - executorType: eager # 线程池类型common、eager:适用于io密集型 - corePoolSize: 1 - maximumPoolSize: 5 - queueCapacity: 5000 - queueType: VariableLinkedBlockingQueue # 任务队列,查看源码QueueTypeEnum枚举类 - rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类 - keepAliveTime: 50 - allowCoreThreadTimeOut: false # 是否允许核心线程池超时 - threadNamePrefix: eagerDtp # 线程名前缀 - waitForTasksToCompleteOnShutdown: false # 参考spring线程池设计,优雅关闭线程池 - awaitTerminationSeconds: 5 # 单位(s) - preStartAllCoreThreads: false # 是否预热所有核心线程,默认false - runTimeout: 200 # 任务执行超时阈值,目前只做告警用,单位(ms) - queueTimeout: 100 # 任务在队列等待超时阈值,目前只做告警用,单位(ms) - taskWrapperNames: [ "ttl" ] # 任务包装器名称,集成TaskWrapper接口 - - threadPoolName: priorityDtpThreadPoolExecutor - executorType: priority # 线程池类型common、eager:适用于io密集型 - corePoolSize: 1 - maximumPoolSize: 1 - queueCapacity: 5000 - rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类 - keepAliveTime: 50 - allowCoreThreadTimeOut: false # 是否允许核心线程池超时 - threadNamePrefix: eagerDtp # 线程名前缀 - waitForTasksToCompleteOnShutdown: false # 参考spring线程池设计,优雅关闭线程池 - awaitTerminationSeconds: 5 # 单位(s) - preStartAllCoreThreads: false # 是否预热所有核心线程,默认false - runTimeout: 10000 # 任务执行超时阈值,目前只做告警用,单位(ms) - queueTimeout: 10000 # 任务在队列等待超时阈值,目前只做告警用,单位(ms) - taskWrapperNames: [ "ttl" ] # 任务包装器名称,集成TaskWrapper接口 \ No newline at end of file +dynamictp: + enabled: true + enabledBanner: true # 是否开启banner打印,默认true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: jmx,micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs + monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s + configType: yml # 配置文件类型 + platforms: # 通知报警平台配置 + - platform: wechat + platformId: "1" + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + platformId: "2" + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + platformId: "3" + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 + - threadPoolName: testRunTimeoutDtpExecutor + executorType: common # 线程池类型common、eager:适用于io密集型 + corePoolSize: 1 + maximumPoolSize: 1 + queueCapacity: 500 + 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" ] # 任务包装器名称,集成TaskWrapper接口 + - threadPoolName: testQueueTimeoutDtpExecutor + executorType: common # 线程池类型common、eager:适用于io密集型 + corePoolSize: 1 + maximumPoolSize: 1 + queueCapacity: 500 + 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" ] # 任务包装器名称,集成TaskWrapper接口 + - threadPoolName: testRejectedQueueTimeoutCancelDtpExecutor + executorType: common # 线程池类型common、eager:适用于io密集型 + corePoolSize: 1 + maximumPoolSize: 1 + queueCapacity: 50 + 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" ] # 任务包装器名称,集成TaskWrapper接口 + - threadPoolName: eagerDtpThreadPoolExecutor + executorType: eager # 线程池类型common、eager:适用于io密集型 + corePoolSize: 1 + maximumPoolSize: 5 + queueCapacity: 5000 + queueType: VariableLinkedBlockingQueue # 任务队列,查看源码QueueTypeEnum枚举类 + rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类 + keepAliveTime: 50 + allowCoreThreadTimeOut: false # 是否允许核心线程池超时 + threadNamePrefix: eagerDtp # 线程名前缀 + waitForTasksToCompleteOnShutdown: false # 参考spring线程池设计,优雅关闭线程池 + awaitTerminationSeconds: 5 # 单位(s) + preStartAllCoreThreads: false # 是否预热所有核心线程,默认false + runTimeout: 200 # 任务执行超时阈值,目前只做告警用,单位(ms) + queueTimeout: 100 # 任务在队列等待超时阈值,目前只做告警用,单位(ms) + taskWrapperNames: [ "ttl" ] # 任务包装器名称,集成TaskWrapper接口 + - threadPoolName: priorityDtpThreadPoolExecutor + executorType: priority # 线程池类型common、eager:适用于io密集型 + corePoolSize: 1 + maximumPoolSize: 1 + queueCapacity: 5000 + rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类 + keepAliveTime: 50 + allowCoreThreadTimeOut: false # 是否允许核心线程池超时 + threadNamePrefix: eagerDtp # 线程名前缀 + waitForTasksToCompleteOnShutdown: false # 参考spring线程池设计,优雅关闭线程池 + awaitTerminationSeconds: 5 # 单位(s) + preStartAllCoreThreads: false # 是否预热所有核心线程,默认false + runTimeout: 10000 # 任务执行超时阈值,目前只做告警用,单位(ms) + queueTimeout: 10000 # 任务在队列等待超时阈值,目前只做告警用,单位(ms) + taskWrapperNames: [ "ttl" ] # 任务包装器名称,集成TaskWrapper接口 + - threadPoolName: eagerDtpThreadPoolExecutor + executorType: eager # 线程池类型common、eager:适用于io密集型 + corePoolSize: 1 + maximumPoolSize: 5 + queueCapacity: 5000 + queueType: VariableLinkedBlockingQueue # 任务队列,查看源码QueueTypeEnum枚举类 + rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类 + keepAliveTime: 50 + allowCoreThreadTimeOut: false # 是否允许核心线程池超时 + threadNamePrefix: eagerDtp # 线程名前缀 + waitForTasksToCompleteOnShutdown: false # 参考spring线程池设计,优雅关闭线程池 + awaitTerminationSeconds: 5 # 单位(s) + preStartAllCoreThreads: false # 是否预热所有核心线程,默认false + runTimeout: 200 # 任务执行超时阈值,目前只做告警用,单位(ms) + queueTimeout: 100 # 任务在队列等待超时阈值,目前只做告警用,单位(ms) + taskWrapperNames: [ "ttl" ] # 任务包装器名称,集成TaskWrapper接口 + - threadPoolName: alarmDtpThreadPoolExecutor + executorType: eager # 线程池类型common、eager:适用于io密集型 + corePoolSize: 1 + maximumPoolSize: 10 + queueCapacity: 5000 + rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类 + keepAliveTime: 50 + allowCoreThreadTimeOut: false # 是否允许核心线程池超时 + threadNamePrefix: eagerDtp # 线程名前缀 + waitForTasksToCompleteOnShutdown: false # 参考spring线程池设计,优雅关闭线程池 + awaitTerminationSeconds: 5 # 单位(s) + preStartAllCoreThreads: false # 是否预热所有核心线程,默认false + runTimeout: 10000 # 任务执行超时阈值,目前只做告警用,单位(ms) + queueTimeout: 10000 # 任务在队列等待超时阈值,目前只做告警用,单位(ms) + taskWrapperNames: [ "ttl" ] # 任务包装器名称,集成TaskWrapper接口 + notifyItems: + - type: "myAlarmType" + enabled: true + count: 2 + platformIds: ["2"] diff --git a/test/test-core/src/test/resources/dynamic-tp-nacos-demo-dtp-dev.yml b/test/test-core/src/test/resources/dynamic-tp-nacos-demo-dtp-dev.yml index 057fc2628f5556b21ae4add3ed3bf6dbea6933db..0b47afd99f10068844cf672df3b087adec5a8930 100644 --- a/test/test-core/src/test/resources/dynamic-tp-nacos-demo-dtp-dev.yml +++ b/test/test-core/src/test/resources/dynamic-tp-nacos-demo-dtp-dev.yml @@ -1,190 +1,188 @@ # 动态线程池配置文件,建议单独开一个文件放到配置中心,字段详解看readme介绍 -spring: - dynamic: - tp: - enabled: true - enabledBanner: true # 是否开启banner打印,默认true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs - monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s - nacos: # nacos配置,不配置有默认值(规则name-dev.yml这样),cloud应用不需要配置 - dataId: dynamic-tp-nacos-demo-dev.yml - group: DEFAULT_GROUP - configType: yml # 配置文件类型 - platforms: # 通知报警平台配置 - - platform: wechat - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - - platform: wechat - platformId: my-1 - urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 - receivers: test1,test2 # 接受人企微名称 - - platform: ding - platformId: my-2 - urlKey: f80dad441fcd655438f4a08dcd6a # 替换 - secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 - receivers: 15810119805 # 钉钉账号手机号 - - platform: lark - platformId: my-3 - urlKey: 0d944ae7-b24a-40 # 替换 - receivers: test1,test2 # 接受人飞书名称/openid - tomcatTp: # tomcat web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - jettyTp: # jetty web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - undertowTp: # undertow web server线程池配置 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - hystrixTp: # hystrix 线程池配置 - - threadPoolName: hystrix1 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - dubboTp: # dubbo 线程池配置 - - threadPoolName: dubboTp#20880 - corePoolSize: 100 - maximumPoolSize: 400 - keepAliveTime: 60 - rocketMqTp: # rocketmq 线程池配置 - - threadPoolName: group1#topic1 - corePoolSize: 200 - maximumPoolSize: 400 - keepAliveTime: 60 - executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 - - threadPoolName: dtpExecutor1 - executorType: common # 线程池类型common、eager:适用于io密集型 - corePoolSize: 1 - maximumPoolSize: 1 - queueCapacity: 5 - 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"] # 任务包装器名称,集成TaskWrapper接口 - 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 - - threadPoolName: orderedDtpExecutor - executorType: ordered - corePoolSize: 4 - maximumPoolSize: 6 - queueCapacity: 2000 - queueType: VariableLinkedBlockingQueue - rejectedHandlerType: CallerRunsPolicy - keepAliveTime: 3 - allowCoreThreadTimeOut: false - threadNamePrefix: test - taskWrapperNames: ["ttl", "mdc"] # 任务包装器名称,集成TaskWrapper接口 - - threadPoolName: dtpExecutor12 - executorType: scheduled # 线程池类型common、eager:适用于io密集型 - corePoolSize: 6 - maximumPoolSize: 8 - queueCapacity: 200 - queueType: DelayQueue # 任务队列,查看源码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"] # 任务包装器名称,集成TaskWrapper接口 - notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警) - - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 - enabled: true - threshold: 80 # 报警阈值 - platformIds: [ my-1, my-2 ] # 可选配置,不配置默认拿上层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 - - threadPoolName: dtpExecutor13 # 测试当核心数为0时,ScheduledThreadPoolExecutor占用CPU问题 - executorType: scheduled # 线程池类型common、eager:适用于io密集型 - corePoolSize: 0 # 0时,ScheduledThreadPoolExecutor占用CPU问题 - maximumPoolSize: 100 - queueCapacity: 200 - queueType: DelayQueue # 任务队列,查看源码QueueTypeEnum枚举类 - notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警) - - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 - enabled: true - threshold: 0 # 报警阈值 - platformIds: [ my-1, my-2 ] # 可选配置,不配置默认拿上层platforms配置的所以平台 - interval: 1 # 报警间隔(单位: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 - - threadPoolName: dtpExecutor14 # 测试当核心数为0时,ScheduledThreadPoolExecutor占用CPU问题 - executorType: scheduled # 线程池类型common、eager:适用于io密集型 - corePoolSize: 0 # 0时,ScheduledThreadPoolExecutor占用CPU问题 - maximumPoolSize: 100 - queueCapacity: 200 - queueType: DelayQueue # 任务队列,查看源码QueueTypeEnum枚举类 - platformIds: [ my-1, my-2 ] # 可选配置,不配置默认拿上层platforms配置的所以平台 - notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警) - - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 - enabled: true - threshold: 0 # 报警阈值 - platformIds: [ my-1, my-3 ] # 可选配置,不配置默认拿上层platforms配置的所以平台 +dynamictp: + enabled: true + enabledBanner: true # 是否开启banner打印,默认true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: micrometer,logging # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + logPath: /home/logs # 监控日志数据路径,默认 ${user.home}/logs + monitorInterval: 5 # 监控时间间隔(报警判断、指标采集),默认5s + nacos: # nacos配置,不配置有默认值(规则name-dev.yml这样),cloud应用不需要配置 + dataId: dynamic-tp-nacos-demo-dev.yml + group: DEFAULT_GROUP + configType: yml # 配置文件类型 + platforms: # 通知报警平台配置 + - platform: wechat + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + - platform: wechat + platformId: my-1 + urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c # 替换 + receivers: test1,test2 # 接受人企微名称 + - platform: ding + platformId: my-2 + urlKey: f80dad441fcd655438f4a08dcd6a # 替换 + secret: SECb5441fa6f375d5b9d21 # 替换,非sign模式可以没有此值 + receivers: 15810119805 # 钉钉账号手机号 + - platform: lark + platformId: my-3 + urlKey: 0d944ae7-b24a-40 # 替换 + receivers: test1,test2 # 接受人飞书名称/openid + tomcatTp: # tomcat web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + jettyTp: # jetty web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + undertowTp: # undertow web server线程池配置 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + hystrixTp: # hystrix 线程池配置 + - threadPoolName: hystrix1 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + dubboTp: # dubbo 线程池配置 + - threadPoolName: dubboTp#20880 + corePoolSize: 100 + maximumPoolSize: 400 + keepAliveTime: 60 + rocketMqTp: # rocketmq 线程池配置 + - threadPoolName: group1#topic1 + corePoolSize: 200 + maximumPoolSize: 400 + keepAliveTime: 60 + executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 + - threadPoolName: dtpExecutor1 + executorType: common # 线程池类型common、eager:适用于io密集型 + corePoolSize: 1 + maximumPoolSize: 1 + queueCapacity: 5 + 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"] # 任务包装器名称,集成TaskWrapper接口 + 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 + - threadPoolName: orderedDtpExecutor + executorType: ordered + corePoolSize: 4 + maximumPoolSize: 6 + queueCapacity: 2000 + queueType: VariableLinkedBlockingQueue + rejectedHandlerType: CallerRunsPolicy + keepAliveTime: 3 + allowCoreThreadTimeOut: false + threadNamePrefix: test + taskWrapperNames: ["ttl", "mdc"] # 任务包装器名称,集成TaskWrapper接口 + - threadPoolName: dtpExecutor12 + executorType: scheduled # 线程池类型common、eager:适用于io密集型 + corePoolSize: 6 + maximumPoolSize: 8 + queueCapacity: 200 + queueType: DelayQueue # 任务队列,查看源码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"] # 任务包装器名称,集成TaskWrapper接口 + notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警) + - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 + enabled: true + threshold: 80 # 报警阈值 + platformIds: [ my-1, my-2 ] # 可选配置,不配置默认拿上层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 + - threadPoolName: dtpExecutor13 # 测试当核心数为0时,ScheduledThreadPoolExecutor占用CPU问题 + executorType: scheduled # 线程池类型common、eager:适用于io密集型 + corePoolSize: 0 # 0时,ScheduledThreadPoolExecutor占用CPU问题 + maximumPoolSize: 100 + queueCapacity: 200 + queueType: DelayQueue # 任务队列,查看源码QueueTypeEnum枚举类 + notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警) + - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 + enabled: true + threshold: 0 # 报警阈值 + platformIds: [ my-1, my-2 ] # 可选配置,不配置默认拿上层platforms配置的所以平台 + interval: 1 # 报警间隔(单位: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 + - threadPoolName: dtpExecutor14 # 测试当核心数为0时,ScheduledThreadPoolExecutor占用CPU问题 + executorType: scheduled # 线程池类型common、eager:适用于io密集型 + corePoolSize: 0 # 0时,ScheduledThreadPoolExecutor占用CPU问题 + maximumPoolSize: 100 + queueCapacity: 200 + queueType: DelayQueue # 任务队列,查看源码QueueTypeEnum枚举类 + platformIds: [ my-1, my-2 ] # 可选配置,不配置默认拿上层platforms配置的所以平台 + notifyItems: # 报警项,不配置自动会按默认值配置(变更通知、容量报警、活性报警、拒绝报警、任务超时报警) + - type: capacity # 报警项类型,查看源码 NotifyTypeEnum枚举类 + enabled: true + threshold: 0 # 报警阈值 + platformIds: [ my-1, my-3 ] # 可选配置,不配置默认拿上层platforms配置的所以平台 # platforms: [wechat, ding] # 可选配置,不配置默认拿上层platforms配置的所以平台 - interval: 1 # 报警间隔(单位:s) - - type: change - enabled: true \ No newline at end of file + interval: 1 # 报警间隔(单位:s) + - type: change + enabled: true \ No newline at end of file diff --git a/test/test-core/src/test/resources/postprocessor-dtp-dev.yml b/test/test-core/src/test/resources/postprocessor-dtp-dev.yml index c4fc28dc0a696af9fcb5ce0143f86f4b151c6e75..b7d8daa5ae5a6ff5ce59b326ca4b3034f5949c2a 100644 --- a/test/test-core/src/test/resources/postprocessor-dtp-dev.yml +++ b/test/test-core/src/test/resources/postprocessor-dtp-dev.yml @@ -20,29 +20,29 @@ management: health: defaults: enabled: true -spring: - dynamic: - tp: - enabled: true - enabledCollect: true # 是否开启监控指标采集,默认false - collectorTypes: micrometer # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer - monitorInterval: 5 # 监控时间间隔(报警检测、指标采集),默认5s - executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 - - threadPoolName: asyncExecutor - threadPoolAliasName: 异步线程池 # 线程池别名 - executorType: common # 线程池类型common、eager:适用于io密集型 - corePoolSize: 3 - maximumPoolSize: 10 - queueCapacity: 100 - queueType: VariableLinkedBlockingQueue # 任务队列,查看源码QueueTypeEnum枚举类 - rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类 - keepAliveTime: 50 - allowCoreThreadTimeOut: false # 是否允许核心线程池超时 - threadNamePrefix: AsyncThread- # 线程名前缀 - waitForTasksToCompleteOnShutdown: false # 参考spring线程池设计,优雅关闭线程池 - awaitTerminationSeconds: 5 # 单位(s) - preStartAllCoreThreads: false # 是否预热所有核心线程,默认false - runTimeout: 200 # 任务执行超时阈值,目前只做告警用,单位(ms) - queueTimeout: 100 # 任务在队列等待超时阈值,目前只做告警用,单位(ms) - taskWrapperNames: [ "ttl", "mdc","cta" ] # 任务包装器名称,继承TaskWrapper接口 - notifyEnabled: false # 是否开启报警,默认true \ No newline at end of file + + +dynamictp: + enabled: true + enabledCollect: true # 是否开启监控指标采集,默认false + collectorTypes: micrometer # 监控数据采集器类型(logging | micrometer | internal_logging),默认micrometer + monitorInterval: 5 # 监控时间间隔(报警检测、指标采集),默认5s + executors: # 动态线程池配置,都有默认值,采用默认值的可以不配置该项,减少配置量 + - threadPoolName: asyncExecutor + threadPoolAliasName: 异步线程池 # 线程池别名 + executorType: common # 线程池类型common、eager:适用于io密集型 + corePoolSize: 3 + maximumPoolSize: 10 + queueCapacity: 100 + queueType: VariableLinkedBlockingQueue # 任务队列,查看源码QueueTypeEnum枚举类 + rejectedHandlerType: CallerRunsPolicy # 拒绝策略,查看RejectedTypeEnum枚举类 + keepAliveTime: 50 + allowCoreThreadTimeOut: false # 是否允许核心线程池超时 + threadNamePrefix: AsyncThread- # 线程名前缀 + waitForTasksToCompleteOnShutdown: false # 参考spring线程池设计,优雅关闭线程池 + awaitTerminationSeconds: 5 # 单位(s) + preStartAllCoreThreads: false # 是否预热所有核心线程,默认false + runTimeout: 200 # 任务执行超时阈值,目前只做告警用,单位(ms) + queueTimeout: 100 # 任务在队列等待超时阈值,目前只做告警用,单位(ms) + taskWrapperNames: [ "ttl", "mdc","cta" ] # 任务包装器名称,继承TaskWrapper接口 + notifyEnabled: false # 是否开启报警,默认true \ No newline at end of file diff --git a/test/test-extension/pom.xml b/test/test-extension/pom.xml index 42d887aaf363cd789ea83452f445a37492070dec..fd280fb1d91bacedd001b56abde6160d5bc86b32 100644 --- a/test/test-extension/pom.xml +++ b/test/test-extension/pom.xml @@ -3,35 +3,17 @@ 4.0.0 org.dromara.dynamictp - dynamic-tp-all - ${revision} - ../../pom.xml + dynamic-tp-test + 1.2.1 + ../pom.xml dynamic-tp-test-extension - jar + pom - test-extension + + test-extension-agent + test-extension-limiter-redis + - - UTF-8 - - - - - junit - junit - test - - - - org.dromara.dynamictp - dynamic-tp-extension-agent - - - org.junit.jupiter - junit-jupiter-api - test - - diff --git a/test/test-extension/test-extension-agent/pom.xml b/test/test-extension/test-extension-agent/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..541d0ed1ecdc363ee70f81cd557807407b354379 --- /dev/null +++ b/test/test-extension/test-extension-agent/pom.xml @@ -0,0 +1,19 @@ + + 4.0.0 + + org.dromara.dynamictp + dynamic-tp-test-extension + 1.2.1 + ../pom.xml + + + dynamic-tp-test-extension-agent + + + + org.dromara.dynamictp + dynamic-tp-extension-agent + + + diff --git a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/AgentAwareTest.java b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/AgentAwareTest.java similarity index 60% rename from test/test-extension/src/test/java/org/dromara/dynamictp/agent/AgentAwareTest.java rename to test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/AgentAwareTest.java index 7525b188f070b725de4476364ae67919c0dbb69a..63d2afb46851d57d86048858ff229de84a7361e2 100644 --- a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/AgentAwareTest.java +++ b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/AgentAwareTest.java @@ -15,22 +15,27 @@ * limitations under the License. */ -package org.dromara.dynamictp.agent; +package org.dromara.dynamictp.test.extension.agent; -import org.dromara.dynamictp.core.aware.AgentAware; +import org.dromara.dynamictp.common.util.ReflectionUtil; +import org.dromara.dynamictp.core.support.ThreadPoolBuilder; import org.dromara.dynamictp.core.support.task.runnable.DtpRunnable; -import org.junit.Test; +import org.dromara.dynamictp.extension.agent.AgentAware; import org.junit.jupiter.api.Assertions; -import org.springframework.util.ReflectionUtils; +import org.junit.jupiter.api.Test; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; public class AgentAwareTest { @Test public void testDirectOnlyOneDtpRunnable() throws InvocationTargetException, IllegalAccessException { - Method getDtpRunnableInstance = ReflectionUtils.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); + Method getDtpRunnableInstance = ReflectionUtil.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); Assertions.assertNotNull(getDtpRunnableInstance); getDtpRunnableInstance.setAccessible(true); @@ -39,7 +44,6 @@ public class AgentAwareTest { }; - MyAgentWrapper myAgentWrapper = new MyAgentWrapper(runnable, new Object()); Object result = getDtpRunnableInstance.invoke(new AgentAware(), myAgentWrapper); Assertions.assertTrue(result == myAgentWrapper); @@ -58,7 +62,7 @@ public class AgentAwareTest { DtpRunnable dtpRunnable = new DtpRunnable(runnable, runnable, "test"); MyAgentWrapperTwoRunnable myAgentWrapper = new MyAgentWrapperTwoRunnable(dtpRunnable, runnable, "test"); - Method getDtpRunnableInstance = ReflectionUtils.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); + Method getDtpRunnableInstance = ReflectionUtil.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); Assertions.assertNotNull(getDtpRunnableInstance); getDtpRunnableInstance.setAccessible(true); @@ -79,7 +83,7 @@ public class AgentAwareTest { MyAgentWrapper myAgentWrapper = new MyAgentWrapper(dtpRunnable, new Object()); MyAgentTwoPathRunnableWrapper twoPathRunnableWrapper = new MyAgentTwoPathRunnableWrapper(myAgentWrapper, new Object()); - Method getDtpRunnableInstance = ReflectionUtils.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); + Method getDtpRunnableInstance = ReflectionUtil.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); Assertions.assertNotNull(getDtpRunnableInstance); getDtpRunnableInstance.setAccessible(true); @@ -96,7 +100,7 @@ public class AgentAwareTest { MyAgentWrapper myAgentWrapper = new MyAgentWrapper(dtpRunnable, new Object()); MyAgentWrapperChild myAgentWrapperChild = new MyAgentWrapperChild(myAgentWrapper, new Object()); - Method getDtpRunnableInstance = ReflectionUtils.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); + Method getDtpRunnableInstance = ReflectionUtil.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); Assertions.assertNotNull(getDtpRunnableInstance); getDtpRunnableInstance.setAccessible(true); @@ -117,11 +121,60 @@ public class AgentAwareTest { MyAgentTwoPathRunnableChildWrapper myAgentTwoPathRunnableChildWrapper = new MyAgentTwoPathRunnableChildWrapper(myAgentWrapperChild, myAgentWrapper, new Object()); - Method getDtpRunnableInstance = ReflectionUtils.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); + Method getDtpRunnableInstance = ReflectionUtil.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); Assertions.assertNotNull(getDtpRunnableInstance); getDtpRunnableInstance.setAccessible(true); Object result = getDtpRunnableInstance.invoke(new AgentAware(), myAgentTwoPathRunnableChildWrapper); Assertions.assertTrue(result == dtpRunnable); } + + @Test + public void testNestRunnable() throws InvocationTargetException, IllegalAccessException { + + Runnable runnable = () -> System.out.println("test"); + DtpRunnable dtpRunnable = new DtpRunnable(runnable, runnable, "test"); + MyAgentNestWrapper myAgentNestWrapper = new MyAgentNestWrapper(dtpRunnable); + Method getDtpRunnableInstance = ReflectionUtil.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); + getDtpRunnableInstance.setAccessible(true); + Object result = getDtpRunnableInstance.invoke(new AgentAware(), myAgentNestWrapper); + Assertions.assertTrue(dtpRunnable == dtpRunnable); + } + + @Test + public void testContainNestRunnable() throws InvocationTargetException, IllegalAccessException { + + Runnable runnable = () -> System.out.println("test"); + DtpRunnable dtpRunnable = new DtpRunnable(runnable, runnable, "test"); + MyAgentNestWrapper myAgentNestWrapper = new MyAgentNestWrapper(dtpRunnable); + + MyAgentContainNestWrapper myAgentContainNestWrapper = new MyAgentContainNestWrapper(myAgentNestWrapper); + + Method getDtpRunnableInstance = ReflectionUtil.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); + getDtpRunnableInstance.setAccessible(true); + Object result = getDtpRunnableInstance.invoke(new AgentAware(), myAgentContainNestWrapper); + Assertions.assertTrue(dtpRunnable == dtpRunnable); + } + + @Test + public void testScheduledThreadPoolExecutor() throws InterruptedException { + ScheduledExecutorService scheduledExecutorService = ThreadPoolBuilder.newBuilder() + .dynamic(true) + .corePoolSize(1) + .scheduled() + .buildScheduled(); + + AtomicInteger count = new AtomicInteger(); + CountDownLatch downLatch = new CountDownLatch(3); + scheduledExecutorService.scheduleAtFixedRate(() -> { + if (count.get() >= 3) { + throw new RuntimeException("down"); + } + count.incrementAndGet(); + downLatch.countDown(); + }, 1, 1, TimeUnit.SECONDS); + + downLatch.await(); + Assertions.assertEquals(3, count.get()); + } } diff --git a/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentContainNestWrapper.java b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentContainNestWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..85d7214d5cf3ab15db7b160a20678f4c365a757d --- /dev/null +++ b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentContainNestWrapper.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.test.extension.agent; + +public class MyAgentContainNestWrapper implements Runnable { + + private MyAgentNestWrapper agentNestWrapper; + + public MyAgentContainNestWrapper(MyAgentNestWrapper agentNestWrapper) { + this.agentNestWrapper = agentNestWrapper; + } + + @Override + public void run() { + System.out.println("before"); + agentNestWrapper.run(); + System.out.println("after"); + } +} + diff --git a/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentNestWrapper.java b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentNestWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..14853817ca459d2ecc192733f03eb0918b2c3310 --- /dev/null +++ b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentNestWrapper.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.test.extension.agent; + +import org.dromara.dynamictp.core.support.task.runnable.DtpRunnable; + +public class MyAgentNestWrapper implements Runnable { + + private MyAgentNestWrapper myAgentNestWrapper = this; + + private DtpRunnable dtpRunnable; + + public MyAgentNestWrapper(DtpRunnable dtpRunnable) { + this.dtpRunnable = dtpRunnable; + } + + @Override + public void run() { + System.out.println("before"); + try { + dtpRunnable.run(); + } finally { + System.out.println("finally"); + } + } +} + diff --git a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentTwoPathRunnableChildWrapper.java b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentTwoPathRunnableChildWrapper.java similarity index 96% rename from test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentTwoPathRunnableChildWrapper.java rename to test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentTwoPathRunnableChildWrapper.java index f76d06bf788230ebb22a0de12aee48710231b0dd..e8a33e572c355cc90387ce56094b03fca1375e3c 100644 --- a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentTwoPathRunnableChildWrapper.java +++ b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentTwoPathRunnableChildWrapper.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.dromara.dynamictp.agent; +package org.dromara.dynamictp.test.extension.agent; public class MyAgentTwoPathRunnableChildWrapper implements Runnable { diff --git a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentTwoPathRunnableWrapper.java b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentTwoPathRunnableWrapper.java similarity index 96% rename from test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentTwoPathRunnableWrapper.java rename to test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentTwoPathRunnableWrapper.java index 0f317266128162671dce68960773578b581bbd17..c6c07ab20259f3802e894a1609a85dfe7f08068d 100644 --- a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentTwoPathRunnableWrapper.java +++ b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentTwoPathRunnableWrapper.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.dromara.dynamictp.agent; +package org.dromara.dynamictp.test.extension.agent; public class MyAgentTwoPathRunnableWrapper implements Runnable { diff --git a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentWrapper.java b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentWrapper.java similarity index 93% rename from test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentWrapper.java rename to test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentWrapper.java index 0217e03bd8b2ce8d40b6cd3dea7f7b3d0ef4a2ee..635ee7bb9982b680f18676a8108e88138e260217 100644 --- a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentWrapper.java +++ b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentWrapper.java @@ -15,8 +15,11 @@ * limitations under the License. */ -package org.dromara.dynamictp.agent; +package org.dromara.dynamictp.test.extension.agent; +import lombok.extern.slf4j.Slf4j; + +@Slf4j public class MyAgentWrapper implements Runnable { private Runnable runnable; diff --git a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentWrapperChild.java b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentWrapperChild.java similarity index 95% rename from test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentWrapperChild.java rename to test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentWrapperChild.java index 91117d315653ef1be7d5b2ee8f8bfd55db129aeb..be57472cbd9ed84aa349f02b6f9dd1dea45f35a4 100644 --- a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentWrapperChild.java +++ b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentWrapperChild.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.dromara.dynamictp.agent; +package org.dromara.dynamictp.test.extension.agent; public class MyAgentWrapperChild extends MyAgentWrapper { public MyAgentWrapperChild(MyAgentWrapper runnable, Object busiObj) { diff --git a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentWrapperTwoRunnable.java b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentWrapperTwoRunnable.java similarity index 96% rename from test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentWrapperTwoRunnable.java rename to test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentWrapperTwoRunnable.java index c93c647dd3f65de91c1cfde25f132f0d8a311ea5..4c72a4327f5436855b7cf3661237187a1e5c9a25 100644 --- a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentWrapperTwoRunnable.java +++ b/test/test-extension/test-extension-agent/src/test/java/org/dromara/dynamictp/test/extension/agent/MyAgentWrapperTwoRunnable.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.dromara.dynamictp.agent; +package org.dromara.dynamictp.test.extension.agent; public class MyAgentWrapperTwoRunnable implements Runnable { diff --git a/test/test-extension/test-extension-limiter-redis/pom.xml b/test/test-extension/test-extension-limiter-redis/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..47ac76affda5b15a566356e68c5a2ff410e3827f --- /dev/null +++ b/test/test-extension/test-extension-limiter-redis/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + org.dromara.dynamictp + dynamic-tp-test-extension + 1.2.1 + ../pom.xml + + + dynamic-tp-test-extension-limiter-redis + + + 8 + 8 + UTF-8 + + + + + org.dromara.dynamictp + dynamic-tp-spring-boot-starter-common + + + + org.springframework + spring-aspects + test + + + org.dromara.dynamictp + dynamic-tp-spring-boot-starter-extension-limiter-redis + test + + + org.apache.commons + commons-pool2 + + + org.springframework.boot + spring-boot-starter-data-redis + + + + \ No newline at end of file diff --git a/test/test-extension/test-extension-limiter-redis/src/test/java/org/dromara/dynamictp/test/extension/limiter/redis/RedisRateLimiterTest.java b/test/test-extension/test-extension-limiter-redis/src/test/java/org/dromara/dynamictp/test/extension/limiter/redis/RedisRateLimiterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..627819917855d460eefb3cfa04427c43617d9821 --- /dev/null +++ b/test/test-extension/test-extension-limiter-redis/src/test/java/org/dromara/dynamictp/test/extension/limiter/redis/RedisRateLimiterTest.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dromara.dynamictp.test.extension.limiter.redis; + +import lombok.val; +import org.dromara.dynamictp.extension.limiter.redis.ratelimiter.RedisRateLimiter; +import org.dromara.dynamictp.spring.annotation.EnableDynamicTp; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; +import java.util.List; +import java.util.concurrent.TimeUnit; + +@SpringBootTest(classes = RedisRateLimiterTest.class) +@ExtendWith(SpringExtension.class) +@EnableAutoConfiguration +@EnableDynamicTp +class RedisRateLimiterTest { + + @Resource + private RedisRateLimiter> redisScriptRateLimiter; + + @Test + void testRedisRateLimiterCheck() throws InterruptedException { + for (int i = 0; i < 6; i++) { + TimeUnit.SECONDS.sleep(1); + val res = redisScriptRateLimiter.tryPass("rate-limiter", 120, 5); + System.out.println(res); + } + } +} + + + diff --git a/test/test-extension/test-extension-limiter-redis/src/test/resources/application.yml b/test/test-extension/test-extension-limiter-redis/src/test/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..51d2495e1c16bc0a929bb172cbb8f3299e11f38d --- /dev/null +++ b/test/test-extension/test-extension-limiter-redis/src/test/resources/application.yml @@ -0,0 +1,7 @@ +spring: + redis: + cluster: + nodes: + - 127.0.0.1:6379 + - 127.0.0.1:6379 + - 127.0.0.1:6379 \ No newline at end of file diff --git a/test/test-logging/pom.xml b/test/test-logging/pom.xml index 503686e859718ea60119cdb96ece30f982faddfd..1abde553393859b86200c873ba50dfdd28e0e995 100644 --- a/test/test-logging/pom.xml +++ b/test/test-logging/pom.xml @@ -5,7 +5,7 @@ org.dromara.dynamictp dynamic-tp-test - ${revision} + 1.2.1 ../pom.xml dynamic-tp-test-logging