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
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
Future execAsync(Callable task) { - Map
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();
- }
- });
- }
-
- }