From 5279d6209c3b13c0d3879cf43a0160283a72e9b5 Mon Sep 17 00:00:00 2001 From: "chen.ma" Date: Thu, 3 Mar 2022 09:08:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E6=B7=BB=E5=8A=A0=20Trace=20=E4=BF=A1=E6=81=AF.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hippo4j/common/constant/Constants.java | 2 + .../common/notify/TaskTraceBuilder.java | 32 --------------- .../notify/platform/DingAlarmConstants.java | 2 +- .../platform/DingSendMessageHandler.java | 17 +++----- .../platform/WeChatSendMessageHandler.java | 15 ++----- .../notify/request/AlarmNotifyRequest.java | 5 +-- .../cn/hippo4j/common/toolkit/MDCUtil.java | 25 ++++++++++++ .../executor/DynamicThreadPoolExecutor.java | 9 ++--- .../ThreadPoolNotifyAlarmHandler.java | 13 +++++- .../AbstractBuildThreadPoolTemplate.java | 7 ---- .../executor/support/ThreadPoolBuilder.java | 12 ------ .../example/core/config/ThreadPoolConfig.java | 2 +- .../core/handler/TaskTraceBuilderHandler.java | 40 ++++++++----------- .../core/inittest/RunStateHandlerTest.java | 8 ++++ .../DynamicThreadPoolPostProcessor.java | 4 -- .../core/DynamicThreadPoolPostProcessor.java | 6 +-- 16 files changed, 82 insertions(+), 117 deletions(-) delete mode 100644 hippo4j-common/src/main/java/cn/hippo4j/common/notify/TaskTraceBuilder.java create mode 100644 hippo4j-common/src/main/java/cn/hippo4j/common/toolkit/MDCUtil.java 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);