fix(artemis): 修复 Topic 消息链路追踪断裂

自定义的 topicJmsTemplate 和 topicListenerFactory 未注入 ObservationRegistry,
导致 Topic 消息不写入/提取 traceparent, trace 在 MQ 边界断裂(Queue/Delay 不受影响)。
修复后 Topic 场景 trace 与 Queue/Delay 一样贯穿, 同时修复业务侧缓存失效广播的 trace 断裂。
This commit is contained in:
DaxPay Dev
2026-06-23 10:09:54 +08:00
parent 596d2af830
commit 253def06da

View File

@@ -1,5 +1,6 @@
package cn.daxpay.open.platform.common.artemis;
import io.micrometer.observation.ObservationRegistry;
import jakarta.jms.ConnectionFactory;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -52,10 +53,13 @@ public class ArtemisCommonAutoConfiguration {
/// 不设置 MessageConverter回落到 Spring 默认 `SimpleMessageConverter`String ↔ TextMessage 透传)。
@Bean(ArtemisBeanNames.TOPIC_JMS_TEMPLATE)
@ConditionalOnMissingBean(name = ArtemisBeanNames.TOPIC_JMS_TEMPLATE)
public JmsTemplate topicJmsTemplate(ConnectionFactory connectionFactory) {
public JmsTemplate topicJmsTemplate(ConnectionFactory connectionFactory,
ObservationRegistry observationRegistry) {
JmsTemplate template = new JmsTemplate(connectionFactory);
// 关键:开启 pub-sub 模式destination 解析为 Topicmulticast
template.setPubSubDomain(true);
// 启用 jms.message.publish observation, 把 traceparent 写入 message property, 让 trace 跨 MQ 传播
template.setObservationRegistry(observationRegistry);
return template;
}
@@ -66,12 +70,15 @@ public class ArtemisCommonAutoConfiguration {
/// 取代各业务模块自行创建重复的 Topic ListenerFactory。
@Bean(ArtemisBeanNames.TOPIC_LISTENER_FACTORY)
@ConditionalOnMissingBean(name = ArtemisBeanNames.TOPIC_LISTENER_FACTORY)
public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory) {
public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory,
ObservationRegistry observationRegistry) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
// Topic 模式pub-sub对应 broker 端 multicast 路由类型
factory.setPubSubDomain(true);
factory.setAutoStartup(true);
// 启用 jms.message.process observation, 从 message property 提取 traceparent 恢复 parent context
factory.setObservationRegistry(observationRegistry);
return factory;
}
}