通常情况下,对于投递到RabbitMQ的消息,我们一般都会指定一个唯一的msgId来标识一条消息,跟踪这条消息的状态。

通常情况下,我们的代码都是这样的:

  • 生产者端:

    Spring环境下CorrelationData,msgId的使用方法_百度 image.png

  • 消费者端:

    Spring环境下CorrelationData,msgId的使用方法_百度_02 image.png

但是这样的代码的结果是:​​message.getMessageProperties().getCorrelationIdString()​​​拿到的是null, ​​(String) headers.get("spring_listener_return_correlation");​​拿到的不是我们在生产者set的值,更像是spring框架自动生成的用于标记被rabbitMQ退回的消息。​(这个结果可能跟springboot的版本有关系)

现提出另外一种解决方案:自定义header

  • 生产者

    Spring环境下CorrelationData,msgId的使用方法_spring_03 image.png

  • 消费者

    Spring环境下CorrelationData,msgId的使用方法_spring_04 image.png

  • 进行测试

    Spring环境下CorrelationData,msgId的使用方法_自定义_05 image.png

Spring环境下CorrelationData,msgId的使用方法_自定义_06 image.png


并且这个ID似乎在同一个​批次​里面是一样的

Spring环境下CorrelationData,msgId的使用方法_百度_07 image.png


总结:之所以会发现这个问题,是因为在查看日志监控消息流转的过程中发现,使用​​message.getMessageProperties().getCorrelationIdString()​​的消费者,根本拿不到生产者设置的id。然后百度。

Spring环境下CorrelationData,msgId的使用方法_百度_08 image.png


Spring环境下CorrelationData,msgId的使用方法_百度_09 image.png


Spring环境下CorrelationData,msgId的使用方法_百度_10 image.png


该成使用header,​​spring_listener_return_correlation​​的方式,但是发现取到的值不是我们设置的。所以最后就通过自定义header的方式,传递这个msgId。

所以百度的代码在使用的过程中要注意查看程序的运行状态是否符合预期。

整个代码的结果可能跟Springboot 的版本有关系,我们公司使用的Springboot版本非常低,所以具体情况具体分析~ 这边只是提供一个思路。