1、该方法是将原有的slf4j里面的MDC缓存和Spring里面的RequestContextHolder缓存设置到子线程里面去,同时没有对旧的线程池代码没有任何改动,只对旧的线程池的功能做增强,不做修改,同理可将其它自定义的缓存也同步传到子线程中去
import cn.hutool.core.thread.ThreadUtil;
import org.slf4j.MDC;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
public class ThreadUtilDecorator {
public static void execute(Runnable runnable) {
Map<String, String> map=MDC.getCopyOfContextMap();
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ThreadUtil.execute(()->{
try {
MDC.setContextMap(map);
RequestContextHolder.setRequestAttributes(requestAttributes);
runnable.run();
} finally {
MDC.clear();
RequestContextHolder.resetRequestAttributes();
}
});
}
public static <T> Future<T> execAsync(Callable<T> task) {
Map<String, String> map=MDC.getCopyOfContextMap();
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
return ThreadUtil.execAsync(()->{
try {
MDC.setContextMap(map);
RequestContextHolder.setRequestAttributes(requestAttributes);
return task.call();
} finally {
MDC.clear();
RequestContextHolder.resetRequestAttributes();
}
});
}
}