两种实现方式:
第一种:自定义任务装饰器,并配置到线程池
定义任务装饰器
package com.dc.smart.core.config.mdc;
import org.slf4j.MDC;
import org.springframework.core.task.TaskDecorator;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @author coco
* @date 2022/11/15
*/
@Component
public class MdcTaskDecorator implements TaskDecorator {
@Override
public Runnable decorate(Runnable runnable) {
// Right now: Web thread context !
// (Grab the current thread MDC data)
Map<String, String> contextMap = MDC.getCopyOfContextMap();
return () -> {
try {
// Right now: @Async thread context !
// (Restore the Web thread context's MDC data)
if (contextMap != null) {
MDC.setContextMap(contextMap);
}
runnable.run();
} finally {
MDC.clear();
}
};
}
}
配置线程池
package com.dc.smart.core.config.mdc;
import com.dc.smart.core.config.mdc.MdcTaskDecorator;
import com.dc.smart.core.config.mdc.MdcThreadPoolTaskExecutor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author coco
* @date 2022/11/15
*/
@Configuration
public class ThreadPoolConfig{
//参数初始化
private static final int CPU_COUNT = Runtime.getRunt

该文介绍了两种在Spring中保持MDC(MappedDiagnosticContext)信息在异步任务执行时跨线程传播的方法。第一种是通过自定义TaskDecorator并配置到ThreadPoolTaskExecutor;第二种是直接扩展ThreadPoolTaskExecutor,重写execute和submit方法来注入MDC上下文。
最低0.47元/天 解锁文章
2484

被折叠的 条评论
为什么被折叠?



