RabbitMQ,消费者获取correlationId或correlationIdString均为null的解决方案 + 源码层面解析

springboot2.x请移步此处


找这个问题的,估计很多人都是找的资料都是一样的,多个抄袭的网站都是下图的答案。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6hBeZ7xg-1597047875284)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200810104549007.png)]

但实际操作就发现,这个代码是不全的,比如:this.buildMessage(content,correlationId.getId()),这个方法就是没附上的。直接黑人问号。

先下个结论:按照该网站的做法,还是无法解决问题


请注意:后续版本已修复部分bug,使用起来方便了很多
本文因为建立在springboot 1.x的版本上,很久没更新了。(笔者都没发现,还认真了debug了好久)

本文不作删除,就作为自己不搞清楚版本,还一头debug的教训吧。
当然了,springboot从1.x升级到2.x也是会有很多问题的。
如果在不升级springboot的情况下,本文还是有参考价值的

再次提醒,springboot 2.x 版本以上,请移步另一篇文章:点击跳转


本文环境:springboot 1.5.8.RELEASE + amqp-client 4.0.3.jar

本文分两部分,第一部分先直接给代码实现,第二部分进行原理解析。

实现代码

交换机、路由那些就自己改吧,附上全部代码很累赘,只说关键点

  1. 配置RabbitTemplate (这步同网站的操作)
	@Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) //这个不知道有没有用,测试时是有无都可以,多线程无测试,保留
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
   
   
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessagePropertiesConverter(defaultMessagePropertiesConverter());
        return rabbitTemplate;
    }

    @Bean
    public MessagePropertiesConverter defaultMessagePropertiesConverter() {
   
   
        DefaultMessagePropertiesConverter messagePropertiesConverter = 
            							new DefaultMessagePropertiesConverter();
        messagePropertiesConverter
            .setCorrelationIdPolicy(DefaultMessagePropertiesConverter.CorrelationIdPolicy.STRING);
        return messagePropertiesConverter;
    }
  1. 生产者发送消息前,通过CorrelationAwareMessagePostProcessor设置MessageProperties,绑定correlationId

    (这步的Processor除了在发送时设置,还可以全局设置,原理会提及)

    public void sendMiaoshaMessage(String msg) {
         
         
            CorrelationData correlationData = new CorrelationData();
           String uuid = UUID.randomUUID().toString();
           correlationData.setId(uuid);
            System.out.println("分配ID:" + correlationData.getId());
    
            MessagePostProcessor messagePostProcessor = new CorrelationAwareMessagePostProcessor() {
         
         
                @Override
                public Message postProcessMessage(Message message, Correlation correlation) {
         
         
                    MessageProperties messageProperties = message.getMessageProperties();
                    
                    if(correlation instanceof CorrelationData){
         
         
                        String correlationId = ((CorrelationData) correlation).getId();
                        messageProperties.setCorrelationIdString(correlationId);
                    }
                    // 持久化的设置也是在此处,但与本文无关,因此没有附上
                    return message;
                }
    
                @Override
                public Message postProcessMessage(Message message) throws AmqpException {
         
         
                    return message;
                }
            };
    
            System.out.println("发送消息");
            rabbitTemplate.convertAndSend(MQConfig.MIAOSHA_EXCHANGE, MQConfig.MIAOSHA_ROUTING_KEY,
                    msg, messagePostProcessor, correlationData);
    }
    
  2. 消费者接收消息:

    @RabbitListener(queues = MQConfig.MIAOSHA_QUEUE)
    @RabbitHandler
        public void receive(String msg, Channel channel, Message messages){
         
         
            System
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值