Java Spring sleuth未在Spring调度程序中创建新的traceid
我正在使用SchedulingConfigurer对spring调度程序进行调度,如下所示。但是,并非每次调用“ProcessJob”方法时都会创建新的traceid 即使是下面的方法也始终使用相同的traceid记录日志Java Spring sleuth未在Spring调度程序中创建新的traceid,java,spring-boot,spring-cloud-sleuth,spring-scheduled,Java,Spring Boot,Spring Cloud Sleuth,Spring Scheduled,我正在使用SchedulingConfigurer对spring调度程序进行调度,如下所示。但是,并非每次调用“ProcessJob”方法时都会创建新的traceid 即使是下面的方法也始终使用相同的traceid记录日志 log.info("Performing task"); 这里的问题是什么?以及如何确保每次触发此作业时都有新的traceid 我甚至尝试在newSpan中包装“processJob”方法调用,如下所示:但没有运气 修复1:不工作:
log.info("Performing task");
这里的问题是什么?以及如何确保每次触发此作业时都有新的traceid
我甚至尝试在newSpan中包装“processJob”方法调用,如下所示:但没有运气
修复1:不工作:
private void setSchedule() {
future =
taskScheduler.schedule(
() -> {
Span newSpan = tracer.nextSpan().name("newSpan").start();
try (SpanInScope ws = tracer.withSpanInScope(newSpan.start())) {
log.info("Performing task");
taskManager.processJob();
} finally {
newSpan.finish();
}
},
dynamicTrigger);
}
需要修复的原始类:
public class SchedulerConfig
implements SchedulingConfigurer, ApplicationListener<RefreshScopeRefreshedEvent> {
private final DynamicTrigger dynamicTrigger;
private final TaskManager taskManager;
private TaskScheduler taskScheduler;
private ScheduledFuture<?> future;
@Bean(destroyMethod = "shutdown")
public ExecutorService taskExecutor() {
return Executors.newScheduledThreadPool(1);
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
taskScheduler = taskRegistrar.getScheduler();
setSchedule();
}
private void setSchedule() {
future =
taskScheduler.schedule(
() -> {z
log.info("Performing task");
taskManager.processJob();
},
dynamicTrigger);
}
@Override
public void onApplicationEvent(RefreshScopeRefreshedEvent event) {
log.info("Rescheduling due to change in cron expression");
future.cancel(false);
setSchedule();
}
公共类SchedulerConfig
实现SchedulingConfigurer、ApplicationListener{
私人最终DynamicTrigger DynamicTrigger;
私人最终任务经理;
专用任务调度器任务调度器;
私人计划未来;
@Bean(destromethod=“shutdown”)
公共执行者服务任务执行者(){
返回Executors.newScheduledThreadPool(1);
}
@凌驾
公共无效配置任务(ScheduledTaskRegistrar任务注册器){
taskRegistrator.setScheduler(taskExecutor());
taskScheduler=taskRegistrar.getScheduler();
setSchedule();
}
私有void setSchedule(){
未来=
taskScheduler.schedule(
()->{z
日志信息(“执行任务”);
taskManager.processJob();
},
动态调压器);
}
@凌驾
ApplicationEvent上的公共无效(RefreshScopeRefreshedEvent事件){
log.info(“由于cron表达式的更改而重新安排”);
未来。取消(假);
setSchedule();
}
您启动span的方式不是您假设的方式(例如:您调用start
两次)。请查看文档以了解如何正确启动:
启动新span的最简单方法是在属于SpringBean的方法上使用@NewSpan
,请参阅文档:
对于调度,我认为使用@Scheduled
更简单,请参阅文档:
这也是由Sleuth开箱即用的工具,因此您无需做任何事情即可启动新的Span
:
@Scheduled(fixedDelay=1_000)
公众假期{
log.info(“嘿,看看我在干什么”);
}
如果您不想使用@Scheduled
,您可以使用可跟踪的ScheduledExecutorService
作为执行服务,文档: