赞
踩
目录
版本: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;
- }
- });
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。