重新线程池
提交线程任务的方法改造为
@Override
public <T> Future<T> submit(Runnable task, T result) {
return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()), result);
}
public static <T> Callable<T> wrap(final Callable<T> callable, final Map<String, String> context) {
return () -> {
if (context == null) {
MDC.clear();
} else {
MDC.setContextMap(context);
}
setTraceIdIfAbsent();
try {
return callable.call();
} finally {
MDC.clear();
}
};
}
这样线程池里面的线程运行当前任务的时候,会将父线程的context带过来;这样就实现了context共享的效果。traceId也就不会丢失
本文介绍了一种在线程池中实现MDCContext共享的方法,通过改造线程任务提交方式,确保子线程能继承父线程的MDCContext,从而避免了traceId等关键信息的丢失。
694





