当前位置:   article > 正文

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

convertandsend

目录

问题:

解决:

原因

扩展

问题:

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

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

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

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

解决:

代码如下:

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

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

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

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

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

  1. @Test
  2. public void testSendMessage3() throws Exception {
  3. // send
  4. MessageProperties messageProperties = new MessageProperties();
  5. messageProperties.setMessageId("666666999");
  6. org.springframework.amqp.core.Message message = new Message("mq 消息1234".getBytes(), messageProperties);
  7. rabbitTemplate.convertAndSend("", "12", message, new CorrelationData("34234"));
  8. }

 

原因

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 的自定义消息头添加到消息中:

  1. rabbitTemplate.convertAndSend(exchangeName, routingKey, message, new MessagePostProcessor() {
  2. @Override
  3. public Message postProcessMessage(Message message) throws AmqpException {
  4. message.getMessageProperties().setHeader("myHeader", "myValue");
  5. return message;
  6. }
  7. });

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/399235?site
推荐阅读
相关标签
  

闽ICP备14008679号