2024-05-20 10:01:23 +08:00
|
|
|
|
package com.zhgd.xmgl.config;
|
|
|
|
|
|
|
2024-05-31 11:45:33 +08:00
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
2024-06-06 21:13:17 +08:00
|
|
|
|
import com.zhgd.xmgl.util.LogMdcUtil;
|
2024-05-31 11:45:33 +08:00
|
|
|
|
import com.zhgd.xmgl.util.ThreadLocalUtil;
|
2024-05-20 10:01:23 +08:00
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
|
import org.slf4j.MDC;
|
|
|
|
|
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
import java.util.concurrent.Callable;
|
|
|
|
|
|
import java.util.concurrent.Future;
|
|
|
|
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
|
|
|
public class MdcThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 接口请求开启的异步线程会调用下述方法
|
|
|
|
|
|
*/
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void execute(Runnable task) {
|
|
|
|
|
|
Map<String, String> context = MDC.getCopyOfContextMap(); //复制主线程MDC
|
2024-05-31 11:45:33 +08:00
|
|
|
|
JSONObject tlJo = ThreadLocalUtil.get();
|
2024-05-20 10:01:23 +08:00
|
|
|
|
log.info("MDC异步多线程...");
|
|
|
|
|
|
super.execute(() -> {
|
|
|
|
|
|
if (null != context) {
|
|
|
|
|
|
MDC.setContextMap(context); //主线程MDC赋予子线程
|
|
|
|
|
|
} else {
|
2024-06-06 21:13:17 +08:00
|
|
|
|
LogMdcUtil.setRequestId(); //主线程没有MDC就自己生成一个
|
2024-05-20 10:01:23 +08:00
|
|
|
|
}
|
2024-05-31 11:45:33 +08:00
|
|
|
|
ThreadLocalUtil.set(tlJo);
|
2024-05-20 10:01:23 +08:00
|
|
|
|
try {
|
|
|
|
|
|
task.run();
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
try {
|
2024-06-06 21:13:17 +08:00
|
|
|
|
LogMdcUtil.clear();
|
2024-05-31 11:45:33 +08:00
|
|
|
|
ThreadLocalUtil.remove();
|
2024-05-20 10:01:23 +08:00
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
log.warn("MDC clear exception:{}", e.getMessage());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 定时任务会调用下述方法
|
|
|
|
|
|
*/
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public <T> Future<T> submit(Callable<T> task) {
|
|
|
|
|
|
Map<String, String> context = MDC.getCopyOfContextMap(); //复制主线程MDC
|
2024-05-31 11:45:33 +08:00
|
|
|
|
JSONObject tlJo = ThreadLocalUtil.get();
|
2024-05-20 10:01:23 +08:00
|
|
|
|
log.info("MDC异步多线程...");
|
|
|
|
|
|
return super.submit(() -> {
|
|
|
|
|
|
if (null != context) {
|
|
|
|
|
|
MDC.setContextMap(context); //主线程MDC赋予子线程
|
|
|
|
|
|
} else {
|
2024-06-06 21:13:17 +08:00
|
|
|
|
LogMdcUtil.setRequestId(); //主线程没有MDC就自己生成一个
|
2024-05-20 10:01:23 +08:00
|
|
|
|
}
|
2024-05-31 11:45:33 +08:00
|
|
|
|
ThreadLocalUtil.set(tlJo);
|
2024-05-20 10:01:23 +08:00
|
|
|
|
try {
|
|
|
|
|
|
return task.call();
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
try {
|
2024-06-06 21:13:17 +08:00
|
|
|
|
LogMdcUtil.clear();
|
2024-05-31 11:45:33 +08:00
|
|
|
|
ThreadLocalUtil.remove();
|
2024-05-20 10:01:23 +08:00
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
log.warn("MDC clear exception:{}", e.getMessage());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|