背景
Logback默认的MDCAdapter不支持父子线程传递,而直接使用TTL线程给MDC赋值,线程池情况父子线程的清理时机管理是一个难题。所以选择覆盖Logback的MDC Adapter,用来实现父子线程的默认传递。
步骤
- 创建package.
org.slf4j
,将自定义的MDCAdapter放入到里面。
public class TtlMDCAdapter implements MDCAdapter {
final ThreadLocal<Map<String, String>> copyOnThreadLocal = new TransmittableThreadLocal<>();
private static final int WRITE_OPERATION = 1;
private static final int MAP_COPY_OPERATION = 2;
final ThreadLocal<Integer> lastOperation = new ThreadLocal();
private static TtlMDCAdapter mtcMDCAdapter;
static {
mtcMDCAdapter = new TtlMDCAdapter();
MDC.mdcAdapter = mtcMDCAdapter;
}
...
}
- 实现Spring的配置器。
public class MDCAdapterInitializer implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
TtlMDCAdapter.getInstance();
}
}
- 使配置器生效。在
/src/main/resources/META-INF/spring.factories
中启用配置器。
org.springframework.context.ApplicationContextInitializer=xx.xxx.MDCAdapterInitializer