我正在尝试设置多线程应用程序的跟踪。我已经设置了ThreadPool:
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);
sqsMessage传播到另一个调度程序:
@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");
}
}
这个想法是追踪从SQS接收消息到处理逻辑结束的所有过程 但是所有线程都具有不同的跟踪ID,而MonitoringWorker开始处理消息时,它将采用另一个具有不同跟踪ID的线程:
如何保持相同的traceid,Spring Cloud Sleuth 2.2.3中的spanid可能会有所不同
答案 0 :(得分:1)
使用LazyTraceExecutor
。此类将traceId传播到新线程,并在该过程中创建新的spanId。
有关更多详细信息,请参见
答案 1 :(得分:0)
好的,有人可以告诉我如何在Spring Cloud Sleuth 2.2.3中获取Trace上下文。不能仅使用@Autowire Trace对象,如google示例中所述