|
|
@@ -1,8 +1,12 @@
|
|
|
package com.xuekairui.user.config;
|
|
|
|
|
|
+import com.xuekairui.common.TraceIdGenerator;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.jetbrains.annotations.NotNull;
|
|
|
+import org.slf4j.MDC;
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
+import org.springframework.core.task.TaskDecorator;
|
|
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
|
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
|
|
|
|
|
@@ -57,8 +61,35 @@ public class AsyncConfig {
|
|
|
scheduler.setThreadNamePrefix("scheduling-");
|
|
|
scheduler.setAwaitTerminationSeconds(60);
|
|
|
scheduler.setWaitForTasksToCompleteOnShutdown(true);
|
|
|
+ scheduler.setTaskDecorator(new MdcTraceIdTaskDecorator());
|
|
|
scheduler.setErrorHandler(t ->
|
|
|
log.error("定时任务执行异常", t));
|
|
|
return scheduler;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 定时任务 MDC 装饰器:为每个任务生成独立 traceId,便于无 HTTP 上下文时定位问题
|
|
|
+ */
|
|
|
+ public static class MdcTraceIdTaskDecorator implements TaskDecorator {
|
|
|
+
|
|
|
+ private static final String TRACE_ID_KEY = "traceId";
|
|
|
+
|
|
|
+ @NotNull
|
|
|
+ @Override
|
|
|
+ public Runnable decorate(@NotNull Runnable runnable) {
|
|
|
+ return () -> {
|
|
|
+ String traceId = generateTraceId();
|
|
|
+ MDC.put(TRACE_ID_KEY, traceId);
|
|
|
+ try {
|
|
|
+ runnable.run();
|
|
|
+ } finally {
|
|
|
+ MDC.clear();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ private String generateTraceId() {
|
|
|
+ return TraceIdGenerator.generate();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|