65 lines
2.0 KiB
Java
65 lines
2.0 KiB
Java
|
|
package com.zhgd.xmgl.config;
|
|||
|
|
|
|||
|
|
import com.zhgd.xmgl.util.RequestIdUtil;
|
|||
|
|
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
|
|||
|
|
log.info("MDC异步多线程...");
|
|||
|
|
super.execute(() -> {
|
|||
|
|
if (null != context) {
|
|||
|
|
MDC.setContextMap(context); //主线程MDC赋予子线程
|
|||
|
|
} else {
|
|||
|
|
RequestIdUtil.setRequestId(); //主线程没有MDC就自己生成一个
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
task.run();
|
|||
|
|
} finally {
|
|||
|
|
try {
|
|||
|
|
RequestIdUtil.clear();
|
|||
|
|
} 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
|
|||
|
|
log.info("MDC异步多线程...");
|
|||
|
|
return super.submit(() -> {
|
|||
|
|
if (null != context) {
|
|||
|
|
MDC.setContextMap(context); //主线程MDC赋予子线程
|
|||
|
|
} else {
|
|||
|
|
RequestIdUtil.setRequestId(); //主线程没有MDC就自己生成一个
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
return task.call();
|
|||
|
|
} finally {
|
|||
|
|
try {
|
|||
|
|
RequestIdUtil.clear();
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
log.warn("MDC clear exception:{}", e.getMessage());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|