XxlJob是是一个轻量级分布式任务调度平台。对于此可以通过官网进行学习使用。
我们在拥有Sleuth的环境下使用xxjob的时候,就会发现一个问题就是通过xxjob中调用的代码中并不存在链路,当我在XxlJob中出现异常时,需要跨系统查询日志等操作后,得到结论,该操作耗时耗力。所以我们不如向feign,rpc调用一样在xxjob中添加链路。
为了不变更xxjob的源码结构,这里我通过spring aop的方式对@XxlJob注解进行切面编程,而注解@Xxljob就是一个切点。代码如下所示:
将Tracing注入到Aspect切面类中
@EnableAspectJAutoProxy
@Configuration
public class AOPConfiguration {
@Bean
public TraceXXJobAspect traceXXJobAspect(Tracing tracing){
return new TraceXXJobAspect(tracing);
}
}
TraceXXJobAspect :
@Aspect
@Slf4j
public class TraceXXJobAspect {
private Tracing tracing;
public TraceXXJobAspect(Tracing tracing) {
this.tracing = tracing;
}
private static final String CLASS_KEY = "class";
private static final String METHOD_KEY = "method";
@Around("execution (@com.xxl.job.core.handler.annotation.XxlJob * *.*(..))")
public Object traceBackgroundThread(final ProceedingJoinPoint pjp) throws Throwable {
Tracer tracer = this.tracing.tracer();
//清除scop中原span
tracer.withSpanInScope(null);
String spanName = SpanNameUtil.toLowerHyphen(pjp.getSignature().getName());
Span span = tracer.newTrace().name(spanName);
try (Tracer.SpanInScope ws = tracer.withSpanInScope(span.start())) {
span.tag(CLASS_KEY, pjp.getTarget().getClass().getSimpleName());
span.tag(METHOD_KEY, pjp.getSignature().getName());
return pjp.proceed();
}catch (Throwable ex) {
String message = ex.getMessage() == null ? ex.getClass().getSimpleName()
: ex.getMessage();
span.tag("error", message);
throw ex;
}
finally {
span.finish();
}
}
}