1.自定義註解類app
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Trace { String businessName() default ""; }
2.在須要攔截的方法上加自定義註解@Tracedom
@Trace(businessName = "線上複覈掃描出庫單號") @Token @RequestMapping(value = "/mst-obd-review/checkorderno", method = {RequestMethod.POST, RequestMethod.GET}) public RespJson checkorderno(@RequestParam("orderNo") String orderNo,HttpServletRequest request) { ...
3.自定義攔截器ide
public class RpcTraceInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { TraceContext traceContext = (TraceContext) TraceContext.ctx.get(); //清除traceid traceContext.clear(); //從新生成traceid MDC.put("traceId", traceContext.getTraceId()); return super.preHandle(request, response, handler); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { //請求結束狀況traceid MDC.remove("traceId"); super.afterCompletion(request, response, handler, ex); } }
public class TraceContext { public static ThreadLocal ctx = new InheritableThreadLocal() { //此處用InheritableThreadLocal保證能夠在子線程獲得相同的traceId @Override protected TraceContext initialValue() { return new TraceContext(); } }; private String traceId; public String getTraceId() { if (traceId == null || "".equals(traceId)) { int hashCodeV = UUID.randomUUID().toString().hashCode(); if (hashCodeV < 0) {//有多是負數 hashCodeV = -hashCodeV; } // 0 表明前面補充0 // 4 表明長度爲4 // d 表明參數爲正數型 traceId = String.format("%012d", hashCodeV); } return traceId; } public void clear() { traceId = null; } }