在不使用@Observed
和在每个任务中都有try-catch的情况下,可以使用MDC
(Mapped Diagnostic Context)来实现traceId的传递。
MDC是一个用于在多线程环境中跟踪日志输出的Java类库。它允许将上下文信息(如traceId)与线程绑定,并在日志输出时自动添加到日志中。
下面是一个使用MDC实现traceId传递的示例代码:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.scheduling.annotation.Scheduled;
public class ScheduledTask {
private static final Logger logger = LoggerFactory.getLogger(ScheduledTask.class);
@Scheduled(fixedRate = 1000)
public void task() {
// 生成traceId并将其绑定到MDC
String traceId = generateTraceId();
MDC.put("traceId", traceId);
try {
// 执行定时任务代码
// ...
} catch (Exception e) {
logger.error("Error occurred in task", e);
} finally {
// 清理MDC,确保不会影响其他任务
MDC.clear();
}
}
private String generateTraceId() {
// 生成traceId的逻辑
// ...
}
}
上述代码中,generateTraceId()
方法用于生成唯一的traceId。在每个任务开始时,将生成的traceId绑定到MDC中的"traceId"键。然后,在任务执行过程中,可以通过MDC.get("traceId")
获取当前任务的traceId,并将其添加到日志中。
在任务执行完毕后,需要调用MDC.clear()
方法来清理MDC,以确保不会影响其他任务的traceId。
通过这种方式,即使没有使用@Observed
注解,也能够在每个任务中获取到正确的traceId,并将其添加到日志中。