Как передать MDC из основного потока в неасинхронные потокиJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как передать MDC из основного потока в неасинхронные потоки

Сообщение Anonymous »

Я использую Spring Boot и MDC для регистрации дополнительного контекста с каждой записью журнала в моем приложении REST API. Я настроил MDC в основном потоке, но данные не распространяются на подпотоки, созданные в моих контроллерах REST.
Вот упрощенный пример моего текущего вывода журнала:
> thread: main, data1: foo, data2: bar, data3: null, message: some log entry
> thread: main, data1: foo, data2: bar, data3: null, message: some other log entry
> thread: http-nio-1234-1, data1: null, data2: null, data3: foobar, message: some other log entry
> thread: http-nio-1234-2, data1: null, data2: null, data3: foobar, message: some other log entry

Как видите, data1 и data2 (заданные в основном потоке) доступны только в журналах основного потока, а data3 (заданный в подпотоке) доступен во всех подпотоках.
Как я могу гарантировать, что данные MDC из основного потока передаются в подпотоки, которые не являются асинхронными потоками?
Я нашел множество документации по передаче данных MDC в асинхронные потоки, но это не применимо к моему сценарию, поскольку они не являются асинхронными.
Я использую Spring Boot и платформу ведения журналов SLF4J. Будем очень признательны за любые предложения и идеи.
Мой основной код приложения выглядит следующим образом:
public class MyApiApplication implements CommandLineRunner {

public static void main(final String[] args) {
SpringApplication application = new SpringApplication(MyApiApplication.class);
application.addInitializers(new SomeInitializer());
application.run(args);
}
}

Я попробовал асинхронный проход следующим образом (из этого ответа https://stackoverflow.com/a/60741586/928666):
public class MyApiApplication implements CommandLineRunner {

public static void main(final String[] args) { ... }

@Override
public ThreadPoolTaskExecutor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolExecutor();
executor.setTaskDecorator(new MdcTaskDecorator());
executor.initialize;
return executor;
}
}

// MdcTaskDecorator

class MdcTaskDecorator implements TaskDecorator {

@Override
public Runnable decorate(Runnable runnable) {
Map contextMap = MDC.getCopyOfContextMap();
return () -> {
try {
MDC.setContextMap(contextMap);
runnable.run();
} finally {
MDC.clear();
}
};
}
}


Подробнее здесь: https://stackoverflow.com/questions/789 ... nc-threads
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»