【消息通过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;
    }
});

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mikasa_akm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值