请求唯一标识暂存类
/**
* @Description
* 请求唯一标识暂存类
* 设置和移除方法需要成对的调用,否则可能发生内存泄漏
* setRequestId和removeRequestId是对应的。只设置requestId到当前线程
* setRequestIdWithMDC和removeRequestIdWithMDC对应。设置requestId到当前线程,并将requestId设置到MDC中,将对应的requestId输出到日志文件中
* */
public class RequestIdUtils {
private static final String PFINDER_TRACE_ID = "PFTID";
private static final String SLF4J_REQ_ID = "request-id";
private static final TransmittableThreadLocal<String> holder = new TransmittableThreadLocal<>();
/**
* @Descrption 生成一个请求唯一id
* @return java.lang.String 优先使用pfinder的请求id,否则使用uuid
*/
public static String createRequestId(){
String val = MDC.get(PFINDER_TRACE_ID);
if (StringUtils.isNotEmpty(val)) {
return val;
}
return UUID.randomUUID().toString();
}
/**
* @Descrption 设置requestId到当前的线程
* @param requestId 请求唯一id
* @return void
*/
public static void setRequestId(String requestId) {
holder.set(requestId);
}
/**
* @Descrption 查询当前线程设置的requestId
* 如果没有调用设置方法setRequestId或者setRequestIdWithMDC设置requestId,则会返回null
* @return java.lang.String 线程中暂存的requestId,
*/
public static String getRequestId() {
return holder.get();
}
/**
* @Descrption 移除当前线程暂存的requestId
*/
public static void removeRequestId(){
holder.remove();
}
/**
* @Descrption 暂存traceId到线程中
* 同时将请求id存储到MDC中,在日志组件输出日志时,将traceId输出到日志文件中
* TRUE:标识MDC的值是当前线程设置 FALSE:非当前线程设置
* @param requestId 请求id
* @return java.lang.Boolean
*/
public static Boolean setRequestIdWithMDC(String requestId){
String reqId = MDC.get(SLF4J_REQ_ID);
if (StringUtils.isNotEmpty(reqId)) {
return Boolean.FALSE;
}
setRequestId(requestId);
MDC.put(SLF4J_REQ_ID, requestId);
return Boolean.TRUE;
}
/**
* @Descrption 移除线程中暂存的traceId,根据mdcFlg判断是否移除MDC中的traceId
* @param mdcFlag 是否同步移除MDC中的traceID true:移除 其他:不处理
* @return void
*/
public static void removeRequestIdWithMDC(Boolean mdcFlag){
if (Boolean.TRUE.equals(mdcFlag)) {
removeRequestId();
MDC.remove(SLF4J_REQ_ID);
}
}
}