Журнал регистрации: доступность MDC в вилках, созданных внутри StructuredTaskScope.JAVA

Программисты JAVA общаются здесь
Anonymous
Журнал регистрации: доступность MDC в вилках, созданных внутри StructuredTaskScope.

Сообщение Anonymous »

При использовании StructuredTaskScope из JEP 453 в Java 21+ и разветвлении нескольких задач я бы хотел, чтобы значения MDC распространялись на развилки, чтобы все журналы были правильно коррелированы.
Расширяя пример из JEP, я бы хотел, чтобы все три журнала содержали одинаковые значения MDC:

Код: Выделить всё

Response handle() throws ExecutionException, InterruptedException {
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
// TODO: set MDC "somehow"

Supplier  user  = scope.fork(() -> logger.info("1"));
Supplier order = scope.fork(() -> logger.info("2"));

scope.join().throwIfFailed();

logger.info("3");
return new Response(user.get(), order.get());
}
}
Проблема в том, что MDC не наследуются, что может быть меньшей проблемой в Java до виртуальных потоков. Однако теперь, когда создание новых потоков является дешевым и поощряется, наследование MDC может быть гораздо более полезным и распространенным.
Мои первоначальные попытки решить эту проблему были сосредоточены на использовании ScopedValue (JEP 429). В отличие от ThreadLocal, такие значения наследуются ветвями области видимости, поэтому они кажутся хорошими кандидатами для хранения маркеров MDC.
Чтобы реализовать это, мне пришлось бы либо напрямую обратиться к a ScopedValue из компонентов журналирования Logback (возможно ли это?) или для управления MDC. Я попытался перезаписать MDCAdapter, но это не удалось (похоже, что Logback не использует, например, MDCAdapter.get для фактического чтения значения MDC).

Подробнее здесь: https://stackoverflow.com/questions/781 ... dtaskscope

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