| 
					
				 | 
			
			
				@@ -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(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |