我有一个项目正在通过kafka发送获取事件,我注意到当我开始在EndPoints或任何其他事件生成器方法上使用@Async时。看不到千分尺跟踪日志。您对此有任何解决方案或建议吗?
private final KafkaTemplate<String, Object> kafkaTemplate;
private final KafkaProperties kafkaProperties;
@Async//PROBLEM CHILD.....
public void sendResetPasswordEmail(ResetPasswordEmailEvent resetPasswordEmailEvent) {
kafkaTemplate.send(kafkaProperties.getTopic().getResetPasswordEmail(),resetPasswordEmailEvent);
log.info("Reset password email sent: {} ", resetPasswordEmailEvent.toString());
}
我的 kafkaTemplate 配置就在下面
@RequiredArgsConstructor
@Configuration
public class ProducerConfiguration {
private final KafkaProperties kafkaProperties;
@Bean
public ProducerFactory<String, Object> producerFactory() {
Map<String, Object> configProps = new HashMap<>();
configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaProperties.getAddress());
configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
return new DefaultKafkaProducerFactory<>(configProps);
}
@Bean
public KafkaTemplate<String, Object> kafkaTemplate() {
KafkaTemplate<String, Object> kafkaTemplate = new KafkaTemplate<>(producerFactory());
kafkaTemplate.setMicrometerEnabled(true);
kafkaTemplate.setObservationEnabled(true);
return kafkaTemplate;
}
}
当我不使用@Async时,一切都很好并且可以跟踪,spanId是在日志上创建的。在使用@ASYNC任何其他方法trace之后,spanId无法在日志上跟踪。(我在这种情况下在日志上看到的所有内容[,])
检查了我的 pom 和生产者、消费者以及除了 @ASYNC 之外一切都很好......
Spring Boot 中的任何异步操作都不会自动将 MDC 映射传播到生成的线程——因为它存在于 ThreadLocal 中。
尝试创建您自己的执行程序配置,将 mdc 上下文(线程装饰器)包装在您的线程周围。
然后确保在
@Async("yourExecutor")
中使用此执行程序的名称,以便您可以利用刚刚配置的执行程序。 MDC 上下文现在应该可用(包括您的跟踪/跨度 ID)