|
@@ -0,0 +1,61 @@
|
|
|
|
+package com.fs.core.util;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+import org.slf4j.MDC;
|
|
|
|
+
|
|
|
|
+import java.util.Map;
|
|
|
|
+import java.util.UUID;
|
|
|
|
+import java.util.concurrent.Callable;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * @description:
|
|
|
|
+ * @author: xdd
|
|
|
|
+ * @date: 2025/3/13
|
|
|
|
+ * @Description:
|
|
|
|
+ */
|
|
|
|
+public final class ThreadMdcUtil {
|
|
|
|
+ private static final String traceId = "traceId";
|
|
|
|
+
|
|
|
|
+ public static String generateTraceId() {
|
|
|
|
+ return UUID.randomUUID().toString().replace("-", "");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static void setTraceIdIfAbsent() {
|
|
|
|
+ if (MDC.get(traceId) == null) {
|
|
|
|
+ MDC.put(traceId, generateTraceId());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static<T> Callable<T> wrap(final Callable<T> callable, final Map<String, String> context) {
|
|
|
|
+ return () -> {
|
|
|
|
+ if (context == null) {
|
|
|
|
+ MDC.clear();
|
|
|
|
+ } else {
|
|
|
|
+ MDC.setContextMap(context);
|
|
|
|
+ }
|
|
|
|
+ setTraceIdIfAbsent();
|
|
|
|
+ try {
|
|
|
|
+ return callable.call();
|
|
|
|
+ } finally {
|
|
|
|
+ MDC.clear();
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ public static Runnable wrap(final Runnable runnable, final Map<String, String> context) {
|
|
|
|
+ return () -> {
|
|
|
|
+ if (context == null) {
|
|
|
|
+ MDC.clear();
|
|
|
|
+ } else {
|
|
|
|
+ MDC.setContextMap(context);
|
|
|
|
+ }
|
|
|
|
+ setTraceIdIfAbsent();
|
|
|
|
+ try {
|
|
|
|
+ runnable.run();
|
|
|
|
+ } finally {
|
|
|
|
+ MDC.clear();
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+}
|