Java Spring sleuth未在Spring调度程序中创建新的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:不工作:

我正在使用SchedulingConfigurer对spring调度程序进行调度,如下所示。但是,并非每次调用“ProcessJob”方法时都会创建新的traceid

即使是下面的方法也始终使用相同的traceid记录日志

          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
作为
执行服务,文档: