问题:
版本: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"));
}
原因
- 对象用混了, 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;
}
});
版权归原作者 mikasa_akm 所有, 如有侵权,请联系我们删除。