分布式日志追踪 子线程丢失traceId的解决方法

重新线程池

提交线程任务的方法改造为

@Override
public  Future submit(Runnable task, T result) {
    return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()), result);
}
public static  Callable wrap(final Callable callable, final Map context) {
    return () -> {
        if (context == null) {
            MDC.clear();
        } else {
            MDC.setContextMap(context);
        }
        setTraceIdIfAbsent();
        try {
            return callable.call();
        } finally {
            MDC.clear();
        }
    };
}

 

这样线程池里面的线程运行当前任务的时候,会将父线程的context带过来;这样就实现了context共享的效果。traceId也就不会丢失

 

你可能感兴趣的:(分布式日志)