Эта проблема не имеет ничего общего с Runnable
экземпляром.MDC должен быть установлен для каждого потока, поскольку он использует ThreadLocal для запоминания значений.
Если вы используете Thread
напрямую или ExecutoService
, вы должны убедиться, что значение MDC установлено непосредственно перед запуском Runnable
.Если вы используете пул потоков, он также должен быть очищен после завершения Runnable
.
Есть много способов достичь этого, но один из возможных способов - определить класс-оболочку:
class MDCWrapper implements Runnable {
private final Runnable target;
@Override
public void run() {
MDC.put("txnId", UUID.randomUUID().toString());
try {
target.run();
} finally {
MDC.remove("txnId");
}
}
}
, а затем использовать его как:
Thread t = new Thread(new MDCWrapper(new DeviceEventWorker()));
t.start();