java / expert
Snippet
Manuelle MDC-Kontext-Propagierung in Project Reactor
In reaktiven Spring-Anwendungen geht der ThreadLocal-basierte MDC-Kontext bei Thread-Wechseln verloren. Dieses Muster nutzt Reactor Hooks, um den Kontext aus dem Subscriber-Context bei jeder Operator-Ausführung in die MDC-Map zu heben.
snippet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MDCContextLifter<T> implements CoreSubscriber<T> {private final CoreSubscriber<T> coreSubscriber;public MDCContextLifter(CoreSubscriber<T> coreSubscriber) {this.coreSubscriber = coreSubscriber;}@Overridepublic void onNext(T t) {copyToMDC(coreSubscriber.currentContext());coreSubscriber.onNext(t);}@Overridepublic Context currentContext() {return coreSubscriber.currentContext();}private void copyToMDC(Context context) {if (context.hasKey(MDC_KEY)) {MDC.setContextMap(context.get(MDC_KEY));}}}
spring
Erklärung
1
public class MDCContextLifter<T> implements CoreSubscriber<T>
Implementiert das CoreSubscriber-Interface, um Signal-Emissionen abzufangen.
2
copyToMDC(coreSubscriber.currentContext());
Extrahiert die Context-Map aus dem reaktiven Stream und wendet sie auf den MDC des aktuellen Threads an.
3
return coreSubscriber.currentContext();
Stellt sicher, dass der Kontext korrekt flussaufwärts durch die Operator-Kette gereicht wird.