diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/constant/Constants.java b/hippo4j-common/src/main/java/cn/hippo4j/common/constant/Constants.java
index e5f5e345..83eb881b 100644
--- a/hippo4j-common/src/main/java/cn/hippo4j/common/constant/Constants.java
+++ b/hippo4j-common/src/main/java/cn/hippo4j/common/constant/Constants.java
@@ -82,4 +82,6 @@ public class Constants {
public static final String UNKNOWN = "unknown";
+ public static final String EXECUTE_TIMEOUT_TRACE = "executeTimeoutTrace";
+
}
diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/notify/TaskTraceBuilder.java b/hippo4j-common/src/main/java/cn/hippo4j/common/notify/TaskTraceBuilder.java
deleted file mode 100644
index b05952ea..00000000
--- a/hippo4j-common/src/main/java/cn/hippo4j/common/notify/TaskTraceBuilder.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package cn.hippo4j.common.notify;
-
-/**
- * Task trace decorator.
- *
- * @author chen.ma
- * @date 2022/3/2 19:45
- */
-public interface TaskTraceBuilder {
-
- /**
- * Before.
- */
- default void before() {
-
- }
-
- /**
- * Trace build.
- *
- * @return
- */
- String traceBuild();
-
- /**
- * Clear.
- */
- default void clear() {
-
- }
-
-}
diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/notify/platform/DingAlarmConstants.java b/hippo4j-common/src/main/java/cn/hippo4j/common/notify/platform/DingAlarmConstants.java
index ce7d4faa..c517fd6a 100644
--- a/hippo4j-common/src/main/java/cn/hippo4j/common/notify/platform/DingAlarmConstants.java
+++ b/hippo4j-common/src/main/java/cn/hippo4j/common/notify/platform/DingAlarmConstants.java
@@ -26,7 +26,7 @@ public class DingAlarmConstants {
/**
* Trace 信息
*/
- public static final String DING_ALARM_TIMOUT_TRACE_REPLACE_TXT = "链路信息:%d \n\n";
+ public static final String DING_ALARM_TIMOUT_TRACE_REPLACE_TXT = "链路信息:%s \n\n";
/**
* 替换任务超时模板
diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/notify/platform/DingSendMessageHandler.java b/hippo4j-common/src/main/java/cn/hippo4j/common/notify/platform/DingSendMessageHandler.java
index ad749d90..efb49ec9 100644
--- a/hippo4j-common/src/main/java/cn/hippo4j/common/notify/platform/DingSendMessageHandler.java
+++ b/hippo4j-common/src/main/java/cn/hippo4j/common/notify/platform/DingSendMessageHandler.java
@@ -3,6 +3,7 @@ package cn.hippo4j.common.notify.platform;
import cn.hippo4j.common.notify.*;
import cn.hippo4j.common.notify.request.AlarmNotifyRequest;
import cn.hippo4j.common.notify.request.ChangeParameterNotifyRequest;
+import cn.hippo4j.common.toolkit.StringUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.dingtalk.api.DefaultDingTalkClient;
@@ -40,18 +41,10 @@ public class DingSendMessageHandler implements SendMessageHandler {
+ if (StringUtil.isNotBlank(executeTimeoutTrace)) {
+ alarmNotifyRequest.setExecuteTimeoutTrace(executeTimeoutTrace);
+ }
+
+ hippoSendMessageService.sendAlarmMessage(NotifyTypeEnum.TIMEOUT, alarmNotifyRequest);
+ };
- Runnable task = () -> hippoSendMessageService.sendAlarmMessage(NotifyTypeEnum.TIMEOUT, alarmNotifyRequest);
EXECUTE_TIMEOUT_EXECUTOR.execute(task);
} catch (Throwable ex) {
log.error("Send thread pool execution timeout alarm error.", ex);
diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/support/AbstractBuildThreadPoolTemplate.java b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/support/AbstractBuildThreadPoolTemplate.java
index 9d4ad7b4..b5a23509 100644
--- a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/support/AbstractBuildThreadPoolTemplate.java
+++ b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/support/AbstractBuildThreadPoolTemplate.java
@@ -1,6 +1,5 @@
package cn.hippo4j.core.executor.support;
-import cn.hippo4j.common.notify.TaskTraceBuilder;
import cn.hippo4j.common.toolkit.Assert;
import cn.hippo4j.core.executor.DynamicThreadPoolExecutor;
import lombok.Data;
@@ -129,7 +128,6 @@ public class AbstractBuildThreadPoolTemplate {
}
dynamicThreadPoolExecutor.setTaskDecorator(initParam.getTaskDecorator());
- dynamicThreadPoolExecutor.setTaskTraceBuilder(initParam.getTaskTraceBuilder());
dynamicThreadPoolExecutor.allowCoreThreadTimeOut(initParam.allowCoreThreadTimeOut);
return dynamicThreadPoolExecutor;
}
@@ -193,11 +191,6 @@ public class AbstractBuildThreadPoolTemplate {
*/
private TaskDecorator taskDecorator;
- /**
- * 任务 Trace 构造器
- */
- private TaskTraceBuilder taskTraceBuilder;
-
/**
* 等待终止毫秒
*/
diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/support/ThreadPoolBuilder.java b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/support/ThreadPoolBuilder.java
index 5460f5f4..7d3517b1 100644
--- a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/support/ThreadPoolBuilder.java
+++ b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/support/ThreadPoolBuilder.java
@@ -1,7 +1,6 @@
package cn.hippo4j.core.executor.support;
import cn.hippo4j.common.design.builder.Builder;
-import cn.hippo4j.common.notify.TaskTraceBuilder;
import cn.hippo4j.common.toolkit.Assert;
import org.springframework.core.task.TaskDecorator;
@@ -92,11 +91,6 @@ public class ThreadPoolBuilder implements Builder {
*/
private TaskDecorator taskDecorator;
- /**
- * 任务 Trace 构造器
- */
- private TaskTraceBuilder taskTraceBuilder;
-
/**
* 等待终止毫秒
*/
@@ -223,11 +217,6 @@ public class ThreadPoolBuilder implements Builder {
return this;
}
- public ThreadPoolBuilder taskTraceBuilder(TaskTraceBuilder taskTraceBuilder) {
- this.taskTraceBuilder = taskTraceBuilder;
- return this;
- }
-
public ThreadPoolBuilder awaitTerminationMillis(long awaitTerminationMillis) {
this.awaitTerminationMillis = awaitTerminationMillis;
return this;
@@ -316,7 +305,6 @@ public class ThreadPoolBuilder implements Builder {
.setMaxPoolNum(builder.maxPoolSize)
.setKeepAliveTime(builder.keepAliveTime)
.setCapacity(builder.capacity)
- .setTaskTraceBuilder(builder.taskTraceBuilder)
.setExecuteTimeOut(builder.executeTimeOut)
.setRejectedExecutionHandler(builder.rejectedExecutionHandler)
.setTimeUnit(builder.timeUnit)
diff --git a/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/config/ThreadPoolConfig.java b/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/config/ThreadPoolConfig.java
index fd01f4f4..fe76b611 100644
--- a/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/config/ThreadPoolConfig.java
+++ b/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/config/ThreadPoolConfig.java
@@ -34,8 +34,8 @@ public class ThreadPoolConfig {
public DynamicThreadPoolWrapper messageCenterDynamicThreadPool() {
ThreadPoolExecutor customExecutor = ThreadPoolBuilder.builder()
.dynamicPool()
+ .taskDecorator(new TaskTraceBuilderHandler())
.threadFactory(MESSAGE_CONSUME)
- .taskTraceBuilder(new TaskTraceBuilderHandler())
.build();
return new DynamicThreadPoolWrapper(MESSAGE_CONSUME, customExecutor);
diff --git a/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/handler/TaskTraceBuilderHandler.java b/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/handler/TaskTraceBuilderHandler.java
index 0455ca17..79050a0c 100644
--- a/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/handler/TaskTraceBuilderHandler.java
+++ b/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/handler/TaskTraceBuilderHandler.java
@@ -1,7 +1,10 @@
package cn.hippo4j.example.core.handler;
-import cn.hippo4j.common.notify.TaskTraceBuilder;
+import cn.hippo4j.common.toolkit.StringUtil;
import org.slf4j.MDC;
+import org.springframework.core.task.TaskDecorator;
+
+import static cn.hippo4j.common.constant.Constants.EXECUTE_TIMEOUT_TRACE;
/**
* Task trace builder handler.
@@ -9,30 +12,21 @@ import org.slf4j.MDC;
* @author chen.ma
* @date 2022/3/2 20:46
*/
-public class TaskTraceBuilderHandler implements TaskTraceBuilder {
-
- private final String TRACE_KEY = "traceId";
-
- @Override
- public void before() {
- MDC.put(TRACE_KEY, "https://github.com/acmenlt/dynamic-threadpool 行行好, 点个 Star.");
- }
-
- @Override
- public String traceBuild() {
- String traceStr;
- try {
- traceStr = MDC.get(TRACE_KEY);
- } finally {
- clear();
- }
-
- return traceStr;
- }
+public final class TaskTraceBuilderHandler implements TaskDecorator {
@Override
- public void clear() {
- MDC.remove(TRACE_KEY);
+ public Runnable decorate(Runnable runnable) {
+ String executeTimeoutTrace = MDC.get(EXECUTE_TIMEOUT_TRACE);
+
+ Runnable taskRun = () -> {
+ if (StringUtil.isNotBlank(executeTimeoutTrace)) {
+ MDC.put(EXECUTE_TIMEOUT_TRACE, executeTimeoutTrace);
+ }
+ runnable.run();
+ // 此处不用进行清理操作, 统一在线程任务执行后清理
+ };
+
+ return taskRun;
}
}
diff --git a/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/inittest/RunStateHandlerTest.java b/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/inittest/RunStateHandlerTest.java
index 71e05ec4..b14ba917 100644
--- a/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/inittest/RunStateHandlerTest.java
+++ b/hippo4j-example/hippo4j-example-core/src/main/java/cn/hippo4j/example/core/inittest/RunStateHandlerTest.java
@@ -3,6 +3,7 @@ package cn.hippo4j.example.core.inittest;
import cn.hippo4j.core.executor.DynamicThreadPoolWrapper;
import cn.hutool.core.thread.ThreadUtil;
import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@@ -11,6 +12,8 @@ import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
+import static cn.hippo4j.common.constant.Constants.EXECUTE_TIMEOUT_TRACE;
+
/**
* Test run time metrics.
*
@@ -40,7 +43,12 @@ public class RunStateHandlerTest {
}
private void runTask(ExecutorService executorService) {
+ // 模拟任务运行
new Thread(() -> {
+ /**
+ * 当线程池任务执行超时, 向 MDC 放入 Trace 标识, 报警时打印出来.
+ */
+ MDC.put(EXECUTE_TIMEOUT_TRACE, "https://github.com/acmenlt/dynamic-threadpool 感觉不错来个 Star.");
ThreadUtil.sleep(5000);
for (int i = 0; i < Integer.MAX_VALUE; i++) {
try {
diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/starter/support/DynamicThreadPoolPostProcessor.java b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/starter/support/DynamicThreadPoolPostProcessor.java
index 317a7ce2..e01d44b3 100644
--- a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/starter/support/DynamicThreadPoolPostProcessor.java
+++ b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/starter/support/DynamicThreadPoolPostProcessor.java
@@ -1,7 +1,6 @@
package cn.hippo4j.core.starter.support;
import cn.hippo4j.common.config.ApplicationContextHolder;
-import cn.hippo4j.common.notify.TaskTraceBuilder;
import cn.hippo4j.common.notify.ThreadPoolNotifyAlarm;
import cn.hippo4j.core.executor.DynamicThreadPool;
import cn.hippo4j.core.executor.DynamicThreadPoolExecutor;
@@ -129,9 +128,6 @@ public final class DynamicThreadPoolPostProcessor implements BeanPostProcessor {
long awaitTerminationMillis = ((DynamicThreadPoolExecutor) dynamicThreadPoolWrap.getExecutor()).awaitTerminationMillis;
boolean waitForTasksToCompleteOnShutdown = ((DynamicThreadPoolExecutor) dynamicThreadPoolWrap.getExecutor()).waitForTasksToCompleteOnShutdown;
((DynamicThreadPoolExecutor) newDynamicPoolExecutor).setSupportParam(awaitTerminationMillis, waitForTasksToCompleteOnShutdown);
-
- TaskTraceBuilder taskTraceBuilder = ((DynamicThreadPoolExecutor) dynamicThreadPoolWrap.getExecutor()).getTaskTraceBuilder();
- ((DynamicThreadPoolExecutor) newDynamicPoolExecutor).setTaskTraceBuilder(taskTraceBuilder);
}
dynamicThreadPoolWrap.setExecutor(newDynamicPoolExecutor);
diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/core/DynamicThreadPoolPostProcessor.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/core/DynamicThreadPoolPostProcessor.java
index 251d57bb..5c0f4a3d 100644
--- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/core/DynamicThreadPoolPostProcessor.java
+++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/core/DynamicThreadPoolPostProcessor.java
@@ -4,7 +4,6 @@ import cn.hippo4j.common.config.ApplicationContextHolder;
import cn.hippo4j.common.constant.Constants;
import cn.hippo4j.common.enums.EnableEnum;
import cn.hippo4j.common.model.PoolParameterInfo;
-import cn.hippo4j.common.notify.TaskTraceBuilder;
import cn.hippo4j.common.notify.ThreadPoolNotifyAlarm;
import cn.hippo4j.common.toolkit.JSONUtil;
import cn.hippo4j.common.web.base.Result;
@@ -14,9 +13,9 @@ import cn.hippo4j.core.executor.DynamicThreadPoolWrapper;
import cn.hippo4j.core.executor.manage.GlobalNotifyAlarmManage;
import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage;
import cn.hippo4j.core.executor.support.*;
+import cn.hippo4j.core.toolkit.inet.DynamicThreadPoolAnnotationUtil;
import cn.hippo4j.starter.config.BootstrapProperties;
import cn.hippo4j.starter.remote.HttpAgent;
-import cn.hippo4j.core.toolkit.inet.DynamicThreadPoolAnnotationUtil;
import cn.hutool.core.util.BooleanUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -165,9 +164,6 @@ public final class DynamicThreadPoolPostProcessor implements BeanPostProcessor {
long executeTimeOut = ((DynamicThreadPoolExecutor) dynamicThreadPoolWrap.getExecutor()).getExecuteTimeOut();
((DynamicThreadPoolExecutor) newDynamicPoolExecutor).setExecuteTimeOut(executeTimeOut);
-
- TaskTraceBuilder taskTraceBuilder = ((DynamicThreadPoolExecutor) dynamicThreadPoolWrap.getExecutor()).getTaskTraceBuilder();
- ((DynamicThreadPoolExecutor) newDynamicPoolExecutor).setTaskTraceBuilder(taskTraceBuilder);
}
dynamicThreadPoolWrap.setExecutor(newDynamicPoolExecutor);