wisdomisite-java/src/main/java/com/zhgd/xmgl/config/MdcThreadPoolTaskExecutor.java

73 lines
2.3 KiB
Java
Raw Normal View History

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());
}
}
});
}
}