rabbitmq 创建RabbitTemplate而不跟踪消息后处理器

zpjtge22  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(2)|浏览(184)

我使用与Spring AMQP集成的Spring Cloud Sleuth来在发布消息时启用traceId
Sleuth自动将TracingMessagePostProcessor添加到RabbitTemplate.beforePublishPostProcessor中,以便将跟踪头添加到传出的Rabbit消息中。
我有一个设想:我有一批对象,并希望发布它们,如下所示:

List<Object> listObj = getData(...);
for (Object o : listObj) {
  rabbitTemplate.convertAndSend(exchange, routingKey, o);
}

使用消息时,所有消息都具有相同traceId我不希望出现这种情况
我如何创建一个没有TracingMessagePostProcessorrabbitTemplate bean?或者如何使我发布/使用的每个消息都有一个不同的traceId
我已经看过Spring Cloud侦探的文档了。我可以使用配置...

spring.sleuth.messaging.rabbit.enabled=false

...禁用此特性,但我只想为指定的rabbitTemplate bean禁用它。

knsnq2tg

knsnq2tg1#

《Open Zipkin Brave》中的逻辑是这样的:

/**Instruments an existing {@linkplain RabbitTemplate} */
  public RabbitTemplate decorateRabbitTemplate(RabbitTemplate rabbitTemplate) {
    MessagePostProcessor[] beforePublishPostProcessors =
      appendTracingMessagePostProcessor(rabbitTemplate, beforePublishPostProcessorsField);
    if (beforePublishPostProcessors != null) {
      rabbitTemplate.setBeforePublishPostProcessors(beforePublishPostProcessors);
    }
    return rabbitTemplate;
  }

由于它是无条件的,我建议您为setBeforePublishPostProcessors()方法覆盖RabbitTemplate,并使其主体为空,或者在传播到super之前删除TracingMessagePostProcessor

55ooxyrt

55ooxyrt2#

我使用RabbitTemplate.addBeforePublishPostProcessors从消息属性头中删除头b3

@Autowired
public void removeTraceProcessor(RabbitTemplate noTraceRabbitTemplate) {
    noTraceRabbitTemplate.addBeforePublishPostProcessors(
        message -> {
            message.getMessageProperties().getHeaders().remove("b3");
            return message;
        }
    );
}

来自@Artem-Bilan的第二个解决方案

@Bean
public RabbitTemplate noTraceRabbitTemplate(ConnectionFactory connFactoryLocal) {
    return new RabbitTemplate(connFactoryLocal) {
        @Override
        public void setBeforePublishPostProcessors(MessagePostProcessor... beforePublishPostProcessors) {
            super.setBeforePublishPostProcessors(
                Arrays.stream(beforePublishPostProcessors)
                .filter(p -> !p.getClass().getSimpleName().equals("TracingMessagePostProcessor"))
                .toArray(MessagePostProcessor[]::new)
            );
        }
    };
}

相关问题