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里预设的信息

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

被折叠的 条评论
为什么被折叠?



