java / expert
Snippet
Asynchrone Kontext-Propagierung mit TaskDecorator
Bei der Verwendung von @Async gehen ThreadLocal-Variablen wie der MDC verloren. Ein TaskDecorator ermöglicht es, den Kontext vom aufrufenden Thread zu erfassen und auf den Ausführungsthread anzuwenden, wodurch Trace-IDs und Logging-Kontexte über asynchrone Grenzen hinweg erhalten bleiben.
snippet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MdcTaskDecorator implements TaskDecorator {@Overridepublic Runnable decorate(Runnable runnable) {Map<String, String> contextMap = MDC.getCopyOfContextMap();return () -> {try {if (contextMap != null) MDC.setContextMap(contextMap);runnable.run();} finally {MDC.clear();}};}}
spring
Erklärung
1
MDC.getCopyOfContextMap()
Erfasst den Diagnosekontext des aktuellen Threads, bevor die Aufgabe an einen Pool delegiert wird.
2
MDC.setContextMap(contextMap)
Setzt den erfassten Kontext im Worker-Thread unmittelbar vor der Ausführung der Aufgabe.