添加线程池任务运行超长报警 #112

pull/131/head
chen.ma 3 years ago
parent 27739d458f
commit bfe5626853

@ -26,6 +26,11 @@ public enum NotifyTypeEnum {
/**
* REJECT
*/
REJECT
REJECT,
/**
* TIMEOUT
*/
TIMEOUT
}

@ -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() {
}
}

@ -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 = "<font color='#708090' size=2>链路信息:%d</font> \n\n";
/**
*
*/
public static final String DING_ALARM_TIMOUT_REPLACE_TXT =
"<font color='#708090' size=2>任务执行时间:%d / ms </font> \n\n" +
"<font color='#708090' size=2>超时时间:%d / ms</font> \n\n" +
DING_ALARM_TIMOUT_TRACE_REPLACE_TXT +
" --- \n\n ";
/**
* 线
*/
@ -46,6 +60,7 @@ public class DingAlarmConstants {
"<font color='#708090' size=2>队列元素个数:%d</font> \n\n " +
"<font color='#708090' size=2>队列剩余个数:%d</font> \n\n " +
" --- \n\n " +
DING_ALARM_TIMOUT_REPLACE_TXT +
"<font color='#708090' size=2>拒绝策略:%s</font> \n\n" +
"<font color='#708090' size=2>拒绝策略执行次数:</font><font color='#FF0000' size=2>%d</font> \n\n " +
"<font color='#708090' size=2>OWNER@%s</font> \n\n" +

@ -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<AlarmNotifyReq
String[] receives = notifyConfig.getReceives().split(",");
String afterReceives = Joiner.on(", @").join(receives);
String dingAlarmTxt;
String dingAlarmTimoutReplaceTxt;
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(DING_ALARM_TIMOUT_TRACE_REPLACE_TXT, taskTraceStr);
dingAlarmTimoutReplaceTxt = StrUtil.replace(DING_ALARM_TIMOUT_REPLACE_TXT, DING_ALARM_TIMOUT_TRACE_REPLACE_TXT, weChatAlarmTimoutTraceReplaceTxt);
} else {
dingAlarmTimoutReplaceTxt = StrUtil.replace(DING_ALARM_TIMOUT_REPLACE_TXT, DING_ALARM_TIMOUT_TRACE_REPLACE_TXT, "");
}
dingAlarmTimoutReplaceTxt = String.format(dingAlarmTimoutReplaceTxt, alarmNotifyRequest.getExecuteTime(), alarmNotifyRequest.getExecuteTimeOut());
dingAlarmTxt = StrUtil.replace(DING_ALARM_TXT, DING_ALARM_TIMOUT_REPLACE_TXT, dingAlarmTimoutReplaceTxt);
} else {
dingAlarmTxt = StrUtil.replace(DING_ALARM_TXT, DING_ALARM_TIMOUT_REPLACE_TXT, "");
}
String text = String.format(
DING_ALARM_TXT,
dingAlarmTxt,
// 环境
alarmNotifyRequest.getActive(),
// 线程池ID

@ -1,7 +1,7 @@
package cn.hippo4j.common.notify.platform;
/**
* Ding alarm constants.
* We chat alarm constants.
*
* @author chen.ma
* @date 2021/11/26 20:03
@ -13,6 +13,19 @@ public class WeChatAlarmConstants {
*/
public static final String WE_CHAT_SERVER_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=";
/**
* Trace
*/
public static final String WE_CHAT_ALARM_TIMOUT_TRACE_REPLACE_TXT = "> 链路信息:%s \n";
/**
*
*/
public static final String WE_CHAT_ALARM_TIMOUT_REPLACE_TXT =
"> 任务执行时间:%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**";

@ -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<AlarmNotifyR
String[] receives = notifyConfig.getReceives().split(",");
String afterReceives = Joiner.on("><@").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

@ -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;
}

@ -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<Long> startTime = new ThreadLocal();
public DynamicThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
long executeTimeOut,
boolean waitForTasksToCompleteOnShutdown,
long awaitTerminationMillis,
@NonNull BlockingQueue<Runnable> 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;

@ -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);
}
}
}
/**

@ -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;
/**
*
*/

@ -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<ThreadPoolExecutor> {
*/
private TimeUnit timeUnit = TimeUnit.MILLISECONDS;
/**
* 线
*/
private long executeTimeOut = 10000L;
/**
*
*/
@ -82,14 +88,14 @@ public class ThreadPoolBuilder implements Builder<ThreadPoolExecutor> {
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<ThreadPoolExecutor> {
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<ThreadPoolExecutor> {
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<ThreadPoolExecutor> {
.setMaxPoolNum(builder.maxPoolSize)
.setKeepAliveTime(builder.keepAliveTime)
.setCapacity(builder.capacity)
.setTaskTraceBuilder(builder.taskTraceBuilder)
.setExecuteTimeOut(builder.executeTimeOut)
.setRejectedExecutionHandler(builder.rejectedExecutionHandler)
.setTimeUnit(builder.timeUnit)
.setAllowCoreThreadTimeOut(builder.allowCoreThreadTimeOut)

@ -47,6 +47,11 @@ public class ExecutorProperties {
*/
private Long keepAliveTime;
/**
* executeTimeOut
*/
private Long executeTimeOut;
/**
* allowCoreThreadTimeOut
*/

@ -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);

@ -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);

Loading…
Cancel
Save