springboot2 rabbitTemplate ReturnCallback和消费者如何获取CorrelationId,header

本文详细介绍了在RabbitMQ中如何有效利用CorrelationId和Header进行消息跟踪和传递额外信息。涵盖了发送不同消息类型时设置与获取CorrelationId的方法,以及在消费者端获取这些信息的策略。

CorrelationId一般使用uuid就可以了

一、ReturnCallback获取CorrelationId及header

1.发送的是org.springframework.amqp.core.Message类型

(不是发送时自动转换成Message的(不是byte[]类型的会自动转换),可能需要发送前手动转换)

// 需要发送前预设(建议用这个方法)
message.getMessageProperties().getCorrelationId();
// 这个是在RabbitTemplate发送时setupConfirm方法放进去的,前提是启用了消息确认或消息返回
message.getMessageProperties().getHeaders().get("spring_returned_message_correlation");
// 需要发送前预设
message.getMessageProperties().getHeaders().get(AmqpHeaders.CORRELATION_ID));
// 获取header信息
message.getMessageProperties().getHeaders().get("header1"));

2.发送的是org.springframework.messaging.Message类型,或其他类型的

message.getMessageProperties().getHeaders().get("spring_returned_message_correlation");

header自定义信息遗失,获取不到

二、消费者获取CorrelationId及header

1.发送的是org.springframework.amqp.core.Message类型

// 需要发送前预设(建议用这个方法)
message.getMessageProperties().getCorrelationId();
// 这个是在RabbitTemplate发送时setupConfirm方法放进去的,前提是启用了消息确认或消息返回
message.getMessageProperties().getHeaders().get("spring_returned_message_correlation");
// 需要发送前预设
message.getMessageProperties().getHeaders().get(AmqpHeaders.CORRELATION_ID));
// 获取header信息
message.getMessageProperties().getHeaders().get("header1"));

2.发送的是org.springframework.messaging.Message类型,或其他类型的

// 这个是在RabbitTemplate发送时setupConfirm方法放进去的,前提是启用了消息确认或消息返回
message.getHeaders().get("spring_returned_message_correlation"));
// 需要发送前预设
message.getHeaders().get(AmqpHeaders.CORRELATION_ID));
// 获取header信息
message.getHeaders().get("header1"));

三、使用org.springframework.amqp.core.Message

个人建议,发送"原生"的org.springframework.amqp.core.Message,这样发送的消息及以外的信息都会保留

如CorrelationId,MessageProperties,headers都会保留

发送时就可以直接调用

rabbitTemplate.send(exchange, routingKey, message, correlationData);

在send前,可以手动messageConverter

// 设置messageProperties
MessageProperties messageProperties = new MessageProperties();
messageProperties.setCorrelationId(correlationId);
messageProperties.setHeader("aaa", "111");

Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter();
// jackson2JsonMessageConverter.toMessage()时会自动设置ContentType
// messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON);
// jackson2JsonMessageConverter.toMessage()时会把JavaType放到header里
//  __TypeId__ -> com.xin.xpfs.rabbitmqcommon.bean.Programmer
message = messageConverter.toMessage(messageObject, messageProperties);

个人建议,发送json字符串消息。可以使用Jackson2JsonMessageConverter转换,也可以用jackson转换

ObjectMapper objectMapper = new ObjectMapper();
String jsonStr = objectMapper.writeValueAsString(obj);

而不用自动messageConverter了
rabbitTemplate.convertAndSend(exchange, routingKey, message, correlationData);

默认使用的是MessageConverter是SimpleMessageConverter。可以转java对象,效率一般。

四、使用org.springframework.messaging.Message

不建议发送org.springframework.messaging.Message,或其他的对象。这样发送的消息以外的信息基本都遗失,尤其在ReturnCallback的时候

rabbitTemplate.convertAndSend(exchange, routingKey, message, correlationData);

convert后,MessageProperties是新New的(又添加了点信息),在ReturnCallback时,也取不到header里预设的信息

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值