0


【消息通过rabbitTemplate.converAndSend发送后请求头丢失】

问题:

版本:springboot版本:2.3.4.RELEASE amqp-client:5.9.0

问题:封装的消息通过rabbitTemplate.converAndSend发送后没有请求头

排查:通过debug构建消息时数据是否完整 > 请求头有数据

思路:换成 send发送进行对比

解决:

代码如下:

1. send 发送 org.springframework.amqp.core.Message

@Test
   public void testSendMessage3() throws Exception {
       // send
       MessageProperties messageProperties = new MessageProperties();
       messageProperties.setMessageId("123412341");
       org.springframework.amqp.core.Message message = new Message("mq 消息1234".getBytes(), messageProperties);
       // send方法只能传消息对象
       rabbitTemplate.send("", "15", message);
  }

2. convertAndSend 发送org.springframework.messaging.Message

@Test
   public void testSendMessage4() throws Exception {
       // convertAndSend
       HashMap<String, Object> properties = Maps.newHashMap();
       properties.put("messageId", "134124");
       MessageHeaders messageHeaders = new MessageHeaders(properties);
       // 创建消息
       org.springframework.messaging.Message msg = MessageBuilder.createMessage(message, messageHeaders);
       // convertAndSend会把数据转换为 message
       rabbitTemplate.convertAndSend("", "12", msg,new CorrelationData("166666"));
  }

3. convertAndSend 发送 org.springframework.amqp.core.Message

@Test
    public void testSendMessage3() throws Exception {

        // send
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setMessageId("666666999");
        org.springframework.amqp.core.Message message = new Message("mq 消息1234".getBytes(), messageProperties);
        rabbitTemplate.convertAndSend("", "12", message, new CorrelationData("34234"));
    }

原因

  1. 对象用混了, rabbitTemplate是org.springframework.amqp.core包下的,所以使用org.springframework.amqp.core包下的Message对象就不会有问题,而使用org.springframework.messaging包下的Message对象就会有请求头丢失问题,版本兼容性不好,容易出千奇百怪的问题。

因祸得福让我了解了

rabbitTemplate.convertAndSend的特性,下面是这个API的讲解

扩展

rabbitTemplate.convertAndSend

方法发送消息时,该方法会自动将消息体转换为

byte[]

数组,并将其发送到 RabbitMQ 交换器中。但是,该方法默认情况下并不会设置消息头信息。原因如下:

在 RabbitMQ 中,消息头包含一些元数据,例如消息类型、编码、过期时间、优先级和路由键等,这些元数据会帮助 RabbitMQ 路由和分发消息。由于不同的应用程序和场景需要的消息头可能不同,因此 RabbitMQ 采用了一种灵活的方式,即让发送方在发送消息时自己设置消息头。

因此,在使用

rabbitTemplate.convertAndSend

方法发送消息时,默认情况下不会设置消息头信息。如果需要在消息中设置自定义的消息头信息,可以使用

MessagePostProcessor

接口来在发送消息之前修改消息头。

例如,以下示例使用

MessagePostProcessor

接口将一个名为

myHeader

的自定义消息头添加到消息中:

rabbitTemplate.convertAndSend(exchangeName, routingKey, message, new MessagePostProcessor() {
    @Override
    public Message postProcessMessage(Message message) throws AmqpException {
        message.getMessageProperties().setHeader("myHeader", "myValue");
        return message;
    }
});

本文转载自: https://blog.csdn.net/weixin_52156647/article/details/129672945
版权归原作者 mikasa_akm 所有, 如有侵权,请联系我们删除。

“【消息通过rabbitTemplate.converAndSend发送后请求头丢失】”的评论:

还没有评论