From bfe56268533358fc5fa23498f6e7adfd4c6b5c67 Mon Sep 17 00:00:00 2001 From: "chen.ma" Date: Wed, 2 Mar 2022 21:31:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BA=BF=E7=A8=8B=E6=B1=A0?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=BF=90=E8=A1=8C=E8=B6=85=E9=95=BF=E6=8A=A5?= =?UTF-8?q?=E8=AD=A6=20#112?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hippo4j/common/notify/NotifyTypeEnum.java | 7 ++- .../common/notify/TaskTraceBuilder.java | 32 ++++++++++ .../notify/platform/DingAlarmConstants.java | 15 +++++ .../platform/DingSendMessageHandler.java | 36 +++++++++-- .../notify/platform/WeChatAlarmConstants.java | 16 ++++- .../platform/WeChatSendMessageHandler.java | 34 +++++++++-- .../notify/request/AlarmNotifyRequest.java | 61 +++++++++++++++++++ .../executor/DynamicThreadPoolExecutor.java | 37 +++++++++++ .../ThreadPoolNotifyAlarmHandler.java | 33 ++++++++++ .../AbstractBuildThreadPoolTemplate.java | 13 ++++ .../executor/support/ThreadPoolBuilder.java | 26 ++++++-- .../starter/config/ExecutorProperties.java | 5 ++ .../DynamicThreadPoolPostProcessor.java | 5 ++ .../core/DynamicThreadPoolPostProcessor.java | 7 +++ 14 files changed, 311 insertions(+), 16 deletions(-) create mode 100644 hippo4j-common/src/main/java/cn/hippo4j/common/notify/TaskTraceBuilder.java diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/notify/NotifyTypeEnum.java b/hippo4j-common/src/main/java/cn/hippo4j/common/notify/NotifyTypeEnum.java index 1dbfd7cd..14ce2685 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/notify/NotifyTypeEnum.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/notify/NotifyTypeEnum.java @@ -26,6 +26,11 @@ public enum NotifyTypeEnum { /** * REJECT */ - REJECT + REJECT, + + /** + * TIMEOUT + */ + TIMEOUT } 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 new file mode 100644 index 00000000..b05952ea --- /dev/null +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/notify/TaskTraceBuilder.java @@ -0,0 +1,32 @@ +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 1b5e77b3..ce7d4faa 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 @@ -23,6 +23,20 @@ public class DingAlarmConstants { */ public static final String DING_NOTICE_TITLE = "动态线程池通知"; + /** + * Trace 信息 + */ + public static final String DING_ALARM_TIMOUT_TRACE_REPLACE_TXT = "链路信息:%d \n\n"; + + /** + * 替换任务超时模板 + */ + public static final String DING_ALARM_TIMOUT_REPLACE_TXT = + "任务执行时间:%d / ms \n\n" + + "超时时间:%d / ms \n\n" + + DING_ALARM_TIMOUT_TRACE_REPLACE_TXT + + " --- \n\n "; + /** * 线程池报警通知文本 */ @@ -46,6 +60,7 @@ public class DingAlarmConstants { "队列元素个数:%d \n\n " + "队列剩余个数:%d \n\n " + " --- \n\n " + + DING_ALARM_TIMOUT_REPLACE_TXT + "拒绝策略:%s \n\n" + "拒绝策略执行次数:%d \n\n " + "OWNER:@%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 d6f18ec4..ad749d90 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 @@ -1,11 +1,10 @@ package cn.hippo4j.common.notify.platform; -import cn.hippo4j.common.notify.NotifyConfigDTO; -import cn.hippo4j.common.notify.NotifyPlatformEnum; -import cn.hippo4j.common.notify.SendMessageHandler; +import cn.hippo4j.common.notify.*; import cn.hippo4j.common.notify.request.AlarmNotifyRequest; import cn.hippo4j.common.notify.request.ChangeParameterNotifyRequest; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import com.dingtalk.api.DefaultDingTalkClient; import com.dingtalk.api.DingTalkClient; import com.dingtalk.api.request.OapiRobotSendRequest; @@ -15,9 +14,9 @@ import com.taobao.api.ApiException; import lombok.extern.slf4j.Slf4j; import java.util.List; +import java.util.Objects; -import static cn.hippo4j.common.notify.platform.DingAlarmConstants.DING_ALARM_TXT; -import static cn.hippo4j.common.notify.platform.DingAlarmConstants.DING_NOTICE_TXT; +import static cn.hippo4j.common.notify.platform.DingAlarmConstants.*; /** * Send ding notification message. @@ -38,8 +37,33 @@ public class DingSendMessageHandler implements SendMessageHandler 任务执行时间:%s / ms \n" + + "> 超时时间:%s / ms \n" + + WE_CHAT_ALARM_TIMOUT_TRACE_REPLACE_TXT; + /** * 线程池报警通知文本 */ @@ -34,6 +47,7 @@ public class WeChatAlarmConstants { "> 队列剩余个数:%s \n" + "> 拒绝策略:%s \n" + "> 拒绝策略执行次数:%s \n" + + WE_CHAT_ALARM_TIMOUT_REPLACE_TXT + "> OWNER:<@%s> \n" + "> 提示:%d 分钟内此线程池不会重复告警(可配置) \n\n" + "**播报时间:%s**"; diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/notify/platform/WeChatSendMessageHandler.java b/hippo4j-common/src/main/java/cn/hippo4j/common/notify/platform/WeChatSendMessageHandler.java index 913796c3..77d48d05 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/notify/platform/WeChatSendMessageHandler.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/notify/platform/WeChatSendMessageHandler.java @@ -1,18 +1,19 @@ package cn.hippo4j.common.notify.platform; -import cn.hippo4j.common.notify.NotifyConfigDTO; -import cn.hippo4j.common.notify.NotifyPlatformEnum; -import cn.hippo4j.common.notify.SendMessageHandler; +import cn.hippo4j.common.notify.*; import cn.hippo4j.common.notify.request.AlarmNotifyRequest; import cn.hippo4j.common.notify.request.ChangeParameterNotifyRequest; import cn.hippo4j.common.toolkit.JSONUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import com.google.common.base.Joiner; import lombok.Data; import lombok.experimental.Accessors; import lombok.extern.slf4j.Slf4j; +import java.util.Objects; + import static cn.hippo4j.common.notify.platform.WeChatAlarmConstants.*; /** @@ -34,8 +35,33 @@ public class WeChatSendMessageHandler implements SendMessageHandler<@").join(receives); + String weChatAlarmTxt; + String weChatAlarmTimoutReplaceTxt; + if (Objects.equals(notifyConfig.getTypeEnum(), NotifyTypeEnum.TIMEOUT)) { + TaskTraceBuilder taskTraceBuilder = alarmNotifyRequest.getTaskTraceBuilder(); + if (taskTraceBuilder != null) { + String taskTraceStr = ""; + try { + taskTraceStr = taskTraceBuilder.traceBuild(); + } catch (Exception ex) { + // ignore + } finally { + taskTraceBuilder.clear(); + } + String weChatAlarmTimoutTraceReplaceTxt = String.format(WE_CHAT_ALARM_TIMOUT_TRACE_REPLACE_TXT, taskTraceStr); + weChatAlarmTimoutReplaceTxt = StrUtil.replace(WE_CHAT_ALARM_TIMOUT_REPLACE_TXT, WE_CHAT_ALARM_TIMOUT_TRACE_REPLACE_TXT, weChatAlarmTimoutTraceReplaceTxt); + } else { + weChatAlarmTimoutReplaceTxt = StrUtil.replace(WE_CHAT_ALARM_TIMOUT_REPLACE_TXT, WE_CHAT_ALARM_TIMOUT_TRACE_REPLACE_TXT, ""); + } + + weChatAlarmTimoutReplaceTxt = String.format(weChatAlarmTimoutReplaceTxt, alarmNotifyRequest.getExecuteTime(), alarmNotifyRequest.getExecuteTimeOut()); + weChatAlarmTxt = StrUtil.replace(WE_CHAT_ALARM_TXT, WE_CHAT_ALARM_TIMOUT_REPLACE_TXT, weChatAlarmTimoutReplaceTxt); + } else { + weChatAlarmTxt = StrUtil.replace(WE_CHAT_ALARM_TXT, WE_CHAT_ALARM_TIMOUT_REPLACE_TXT, ""); + } + String text = String.format( - WE_CHAT_ALARM_TXT, + weChatAlarmTxt, // 环境 alarmNotifyRequest.getActive(), // 线程池ID diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/notify/request/AlarmNotifyRequest.java b/hippo4j-common/src/main/java/cn/hippo4j/common/notify/request/AlarmNotifyRequest.java index e87f2eaf..624d4642 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/notify/request/AlarmNotifyRequest.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/notify/request/AlarmNotifyRequest.java @@ -1,6 +1,7 @@ package cn.hippo4j.common.notify.request; import cn.hippo4j.common.notify.NotifyTypeEnum; +import cn.hippo4j.common.notify.TaskTraceBuilder; import cn.hippo4j.common.notify.request.base.BaseNotifyRequest; import lombok.Data; import lombok.experimental.Accessors; @@ -25,34 +26,94 @@ public class AlarmNotifyRequest extends BaseNotifyRequest { */ private NotifyTypeEnum notifyTypeEnum; + /** + * active + */ private String active; + /** + * appName + */ private String appName; + /** + * identify + */ private String identify; + /** + * corePoolSize + */ private Integer corePoolSize; + /** + * maximumPoolSize + */ private Integer maximumPoolSize; + /** + * poolSize + */ private Integer poolSize; + /** + * activeCount + */ private Integer activeCount; + /** + * largestPoolSize + */ private Integer largestPoolSize; + /** + * completedTaskCount + */ private Long completedTaskCount; + /** + * queueName + */ private String queueName; + /** + * capacity + */ private Integer capacity; + /** + * queueSize + */ private Integer queueSize; + /** + * remainingCapacity + */ private Integer remainingCapacity; + /** + * rejectedExecutionHandlerName + */ private String rejectedExecutionHandlerName; + /** + * rejectCountNum + */ private Long rejectCountNum; + /** + * executeTime + */ + private Long executeTime; + + /** + * executeTimeOut + */ + private Long executeTimeOut; + + /** + * taskTraceBuilder + */ + private TaskTraceBuilder taskTraceBuilder; + } diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/DynamicThreadPoolExecutor.java b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/DynamicThreadPoolExecutor.java index d997c4d6..8bf9bbaf 100644 --- a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/DynamicThreadPoolExecutor.java +++ b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/DynamicThreadPoolExecutor.java @@ -1,6 +1,8 @@ package cn.hippo4j.core.executor; +import cn.hippo4j.common.config.ApplicationContextHolder; import cn.hippo4j.core.executor.support.AbstractDynamicExecutorSupport; +import cn.hippo4j.common.notify.TaskTraceBuilder; import cn.hippo4j.core.proxy.RejectedProxyUtil; import lombok.Getter; import lombok.NonNull; @@ -18,10 +20,18 @@ import java.util.concurrent.atomic.AtomicLong; */ public class DynamicThreadPoolExecutor extends AbstractDynamicExecutorSupport { + @Getter + @Setter + private Long executeTimeOut; + @Getter @Setter private TaskDecorator taskDecorator; + @Getter + @Setter + private TaskTraceBuilder taskTraceBuilder; + @Getter @Setter private RejectedExecutionHandler redundancyHandler; @@ -32,10 +42,13 @@ public class DynamicThreadPoolExecutor extends AbstractDynamicExecutorSupport { @Getter private final AtomicLong rejectCount = new AtomicLong(); + private final ThreadLocal startTime = new ThreadLocal(); + public DynamicThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, + long executeTimeOut, boolean waitForTasksToCompleteOnShutdown, long awaitTerminationMillis, @NonNull BlockingQueue workQueue, @@ -44,6 +57,7 @@ public class DynamicThreadPoolExecutor extends AbstractDynamicExecutorSupport { @NonNull RejectedExecutionHandler handler) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, waitForTasksToCompleteOnShutdown, awaitTerminationMillis, workQueue, threadPoolId, threadFactory, handler); this.threadPoolId = threadPoolId; + this.executeTimeOut = executeTimeOut; // Number of dynamic proxy denial policies. RejectedExecutionHandler rejectedProxy = RejectedProxyUtil.createProxy(handler, threadPoolId, rejectCount); @@ -62,6 +76,29 @@ public class DynamicThreadPoolExecutor extends AbstractDynamicExecutorSupport { super.execute(command); } + @Override + protected void beforeExecute(Thread t, Runnable r) { + this.startTime.set(System.currentTimeMillis()); + } + + @Override + protected void afterExecute(Runnable r, Throwable t) { + try { + long startTime = this.startTime.get(); + long endTime = System.currentTimeMillis(); + long executeTime; + boolean executeTimeAlarm = (executeTime = (endTime - startTime)) > executeTimeOut; + if (executeTimeAlarm) { + ThreadPoolNotifyAlarmHandler notifyAlarmHandler = ApplicationContextHolder.getBean(ThreadPoolNotifyAlarmHandler.class); + if (notifyAlarmHandler != null) { + notifyAlarmHandler.asyncSendExecuteTimeOutAlarm(threadPoolId, executeTime, executeTimeOut, this); + } + } + } finally { + this.startTime.remove(); + } + } + @Override protected ExecutorService initializeExecutor() { return this; diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/ThreadPoolNotifyAlarmHandler.java b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/ThreadPoolNotifyAlarmHandler.java index 9869e484..9346902c 100644 --- a/hippo4j-core/src/main/java/cn/hippo4j/core/executor/ThreadPoolNotifyAlarmHandler.java +++ b/hippo4j-core/src/main/java/cn/hippo4j/core/executor/ThreadPoolNotifyAlarmHandler.java @@ -7,6 +7,7 @@ import cn.hippo4j.common.notify.request.AlarmNotifyRequest; import cn.hippo4j.common.notify.request.ChangeParameterNotifyRequest; import cn.hippo4j.core.executor.manage.GlobalNotifyAlarmManage; import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage; +import cn.hippo4j.core.executor.support.ThreadPoolBuilder; import cn.hippo4j.core.toolkit.CalculateUtil; import cn.hippo4j.core.toolkit.IdentifyUtil; import cn.hutool.core.util.StrUtil; @@ -49,6 +50,15 @@ public class ThreadPoolNotifyAlarmHandler implements Runnable, CommandLineRunner r -> new Thread(r, "client.alarm.notify") ); + private final ExecutorService EXECUTE_TIMEOUT_EXECUTOR = ThreadPoolBuilder.builder() + .poolThreadSize(2, 4) + .threadFactory("client.execute.timeout.alarm") + .allowCoreThreadTimeOut(true) + .keepAliveTime(60L, TimeUnit.SECONDS) + .workQueue(new LinkedBlockingQueue(4096)) + .rejected(new ThreadPoolExecutor.AbortPolicy()) + .build(); + @Override public void run(String... args) throws Exception { ALARM_NOTIFY_EXECUTOR.scheduleWithFixedDelay(this, 0, checkStateInterval, TimeUnit.SECONDS); @@ -137,7 +147,30 @@ public class ThreadPoolNotifyAlarmHandler implements Runnable, CommandLineRunner alarmNotifyRequest.setThreadPoolId(threadPoolId); hippoSendMessageService.sendAlarmMessage(NotifyTypeEnum.REJECT, alarmNotifyRequest); } + } + /** + * Async send execute time out alarm. + * + * @param threadPoolId + * @param executeTime + * @param executeTimeOut + * @param threadPoolExecutor + */ + public void asyncSendExecuteTimeOutAlarm(String threadPoolId, long executeTime, long executeTimeOut, ThreadPoolExecutor threadPoolExecutor) { + if (threadPoolExecutor instanceof DynamicThreadPoolExecutor) { + try { + AlarmNotifyRequest alarmNotifyRequest = buildAlarmNotifyReq(threadPoolExecutor); + alarmNotifyRequest.setThreadPoolId(threadPoolId); + alarmNotifyRequest.setExecuteTime(executeTime); + alarmNotifyRequest.setExecuteTimeOut(executeTimeOut); + + 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 ceb712c8..9d4ad7b4 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,5 +1,6 @@ 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; @@ -115,6 +116,7 @@ public class AbstractBuildThreadPoolTemplate { initParam.getMaxPoolNum(), initParam.getKeepAliveTime(), initParam.getTimeUnit(), + initParam.getExecuteTimeOut(), initParam.getWaitForTasksToCompleteOnShutdown(), initParam.getAwaitTerminationMillis(), initParam.getWorkQueue(), @@ -127,6 +129,7 @@ public class AbstractBuildThreadPoolTemplate { } dynamicThreadPoolExecutor.setTaskDecorator(initParam.getTaskDecorator()); + dynamicThreadPoolExecutor.setTaskTraceBuilder(initParam.getTaskTraceBuilder()); dynamicThreadPoolExecutor.allowCoreThreadTimeOut(initParam.allowCoreThreadTimeOut); return dynamicThreadPoolExecutor; } @@ -155,6 +158,11 @@ public class AbstractBuildThreadPoolTemplate { */ private TimeUnit timeUnit; + /** + * 执行超时时间 + */ + private Long executeTimeOut; + /** * 队列最大容量 */ @@ -185,6 +193,11 @@ 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 8f306324..5460f5f4 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,6 +1,7 @@ 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; @@ -46,6 +47,11 @@ public class ThreadPoolBuilder implements Builder { */ private TimeUnit timeUnit = TimeUnit.MILLISECONDS; + /** + * 线程执行超时时间 + */ + private long executeTimeOut = 10000L; + /** * 队列最大容量 */ @@ -82,14 +88,14 @@ public class ThreadPoolBuilder implements Builder { private String threadPoolId; /** - * 是否告警 + * 线程任务装饰器 */ - private boolean isAlarm = false; + private TaskDecorator taskDecorator; /** - * 线程任务装饰器 + * 任务 Trace 构造器 */ - private TaskDecorator taskDecorator; + private TaskTraceBuilder taskTraceBuilder; /** * 等待终止毫秒 @@ -170,6 +176,11 @@ public class ThreadPoolBuilder implements Builder { return this; } + public ThreadPoolBuilder executeTimeOut(long executeTimeOut) { + this.executeTimeOut = executeTimeOut; + return this; + } + public ThreadPoolBuilder keepAliveTime(long keepAliveTime, TimeUnit timeUnit) { this.keepAliveTime = keepAliveTime; this.timeUnit = timeUnit; @@ -212,6 +223,11 @@ 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; @@ -300,6 +316,8 @@ 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) .setAllowCoreThreadTimeOut(builder.allowCoreThreadTimeOut) diff --git a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/starter/config/ExecutorProperties.java b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/starter/config/ExecutorProperties.java index d24a9644..ea1e8133 100644 --- a/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/starter/config/ExecutorProperties.java +++ b/hippo4j-spring-boot/hippo4j-core-spring-boot-starter/src/main/java/cn/hippo4j/core/starter/config/ExecutorProperties.java @@ -47,6 +47,11 @@ public class ExecutorProperties { */ private Long keepAliveTime; + /** + * executeTimeOut + */ + private Long executeTimeOut; + /** * allowCoreThreadTimeOut */ 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 58badff4..317a7ce2 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,6 +1,7 @@ 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; @@ -102,6 +103,7 @@ public final class DynamicThreadPoolPostProcessor implements BeanPostProcessor { .dynamicPool() .workQueue(workQueue) .threadFactory(threadPoolId) + .executeTimeOut(executorProperties.getExecuteTimeOut()) .poolThreadSize(executorProperties.getCorePoolSize(), executorProperties.getMaximumPoolSize()) .keepAliveTime(executorProperties.getKeepAliveTime(), TimeUnit.SECONDS) .rejected(RejectedTypeEnum.createPolicy(executorProperties.getRejectedHandler())) @@ -127,6 +129,9 @@ 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 da5a1f0f..251d57bb 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,6 +4,7 @@ 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; @@ -161,6 +162,12 @@ public final class DynamicThreadPoolPostProcessor implements BeanPostProcessor { long awaitTerminationMillis = ((DynamicThreadPoolExecutor) dynamicThreadPoolWrap.getExecutor()).awaitTerminationMillis; boolean waitForTasksToCompleteOnShutdown = ((DynamicThreadPoolExecutor) dynamicThreadPoolWrap.getExecutor()).waitForTasksToCompleteOnShutdown; ((DynamicThreadPoolExecutor) newDynamicPoolExecutor).setSupportParam(awaitTerminationMillis, waitForTasksToCompleteOnShutdown); + + long executeTimeOut = ((DynamicThreadPoolExecutor) dynamicThreadPoolWrap.getExecutor()).getExecuteTimeOut(); + ((DynamicThreadPoolExecutor) newDynamicPoolExecutor).setExecuteTimeOut(executeTimeOut); + + TaskTraceBuilder taskTraceBuilder = ((DynamicThreadPoolExecutor) dynamicThreadPoolWrap.getExecutor()).getTaskTraceBuilder(); + ((DynamicThreadPoolExecutor) newDynamicPoolExecutor).setTaskTraceBuilder(taskTraceBuilder); } dynamicThreadPoolWrap.setExecutor(newDynamicPoolExecutor);