当前位置: 首页 > 知识库问答 >
问题:

SpringCloudSleuthV2.2.3如何将TraceId传播到另一个线程

仰城
2023-03-14

我正在尝试设置多线程应用程序的跟踪。我已设置线程池:

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setThreadNamePrefix("XXXXXX-");
        executor.initialize();

所以有几个线程。其中一个线程正在侦听SQS队列:

@Scheduled(fixedRateString = "${processing.queue.period:60000}")
public void process() {
..........................................................................
    for (SQSMessage sqsMessage : sqsMessages) {
        String messageReceiptHandle = null;
        try {
             messageReceiptHandle = sqsMessage.getReceiptHandle();
             processMessage(sqsMessage);
        }                               
    }
}
..........................................................................

    public void processMessage(SQSMessage sqsMessage) throws InterruptedException {

        log.debug("Start Processing request: '{}'.", sqsMessage);
        monitoringWorker.addEntityForMonitoring(sqsMessage, processor);
        processor.processMessage(sqsMessage);
        monitoringWorker.removeEntityForMonitoring(sqsMessage.getStagingPrefix());
    }

在此代码段中

monitoringWorker.addEntityForMonitoring(sqsMessage, processor);
@Component
public class MonitoringWorker {

   private List<EntityToMonitor> entitiesForMonitoring = new ArrayList<>();

   public void addEntityForMonitoring(AssetSQSMessage assetSQSMessage, AssetProcessorService service) {
        entitiesForMonitoring.add(new EntityToMonitor(assetSQSMessage, service));
    }

   @Scheduled(fixedDelay = 1000)
   public void monitor() {
        for (EntityToMonitor entity : entitiesForMonitoring) {
            log.info("testmessage");
        }
   }

共有1个答案

景阳曜
2023-03-14

使用LazyTraceExecutor。该类将traceID传播到新线程,并在该过程中创建新的spanID。

有关更多详细信息,请参阅

  • @异步支持
  • @计划支持
 类似资料:
  • 问题内容: 也许,我做错了,但在以下情况下我找不到好的出路。 我想对使用下面的Spring Batch执行作业的服务进行单元测试。通过在单独的线程中预配置来执行作业。在我的单元测试中,我想: 创建几个域对象并通过DAO持久化它们 调用服务方法启动工作 等待作业完成 使用DAO检索域对象并检查其状态 显然,以上所有操作都应在一个事务中执行,但是不幸的是,事务不会传播到新线程中(我理解这背后的原理)。

  • 我尝试在我的微服务中添加一个分布式跟踪(在Azure中的Kubernetes下)。 我在父pom.xml中添加了依赖项: 我使用1.4.1和Camden.sr4是因为fabric8 kubeflix不支持较新的版本。我强制使用1.1.3版本来尝试最新的sleuth版本,看看它是否是sleuth旧版本中的一个bug。 我使用logback-spring.xml的以下配置: 这是我的applicati

  • 问题内容: 我有两个 newAccessLevels.java ,它有两个按钮“ Level 1”,“ Level 2”和 newAccessPanel.java。 我需要获取用户选择“ 1或2”的级别,以便可以在标题中显示它。 accessPanel.java, 例如访问级别1,访问级别2。如何完成此操作。下面是示例代码,因此,如果单击级别1,则将打开标题为* ACCESS LEVEL 1 的n

  • 我想将GitLab CI与.gitlab-ci.yml文件一起使用以使用单独的脚本运行不同的阶段。第一阶段生成一个工具,该工具必须在稍后阶段用于执行测试。我已将生成的工具声明为工件。 现在我如何在后期工作中执行该工具?正确的路径是什么,它周围会有哪些文件? 例如,第一阶段构建工件/bin/TestTool/TestTool。exe,该目录包含其他必需的文件(DLL和其他文件)。我的gitlab c

  • 我有一些spring服务可以提交一些AWS批处理作业。这是调用外部服务请求的简单spring批处理作业。并且我想通过将“org.springframework.cloud:spring-cloud-starter-sleuth”lib包含到classpath中,将在我的服务中生成的traceId传播到这个作业中,并将“traceRestTemplateInterceptor”拦截器添加到用这个tr

  • 问题内容: 我想将多个值从一个servlet传递到另一个servlet。请告诉我如何通过? 问题答案: 取决于您是否使用会话: 使用session.setAttribute()将数组存储在会话变量中。 使用session.getAttribute();检索数组。 但是,变量将一直保留到会话终止,您用其他东西覆盖它或将其删除为止。 如果将一个servlet转发到另一个servlet,则可以将其存储在