Here我找到了有关在任务之间“保存” MDC的示例:
Schedulers.setFactory(new Factory() {
@Override
public ScheduledExecutorService decorateExecutorService(String schedulerType,
Supplier<? extends ScheduledExecutorService> actual) {
// guava WrappingScheduledExecutorService
return new WrappingScheduledExecutorService(actual.get()) {
@Override
protected <T> Callable<T> wrapTask(Callable<T> callable) {
return new MDCCallable(callable);
}
};
}
});
static class MDCCallable<T> implements Callable<T> {
private Map<String, String> ctxMap;
private Callable<T> target;
public MDCCallable(Callable<T> target) {
this.target = target;
ctxMap = MDC.getCopyOfContextMap();
}
@Override
public T call() throws Exception {
MDC.setContextMap(ctxMap);
return target.call();
}
}
它通过静态setFactory
调用来修改静态方法/字段,并且可以在main
中运行。但是如何在spring环境中配置它呢?
好的,我使用@Configuration
创建了一个类,但是下一步该怎么做?
创建一个@Bean
返回的Factory
方法?还是实现一个接口(确切地说是abd覆盖工厂创建)?
顺便说一句如何在应用程序启动期间安全地调用此方法?
建议。请随时在评论中提出其他问题。