JAVA-请求唯一标识暂存类

 请求唯一标识暂存类

/**
 * @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);
        }
    }


}

猜你喜欢

转载自blog.csdn.net/caryeko/article/details/141320808