项目实战之RabbitMQ重试机制进行消息补偿通知
作者:mmseoamin日期:2023-12-25

🧑‍💻作者名称:DaenCode

🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。

😎人生感悟:尝尽人生百味,方知世间冷暖。


在这里插入图片描述


文章目录

  • 🌟架构图
  • 🌟application.properties
  • 🌟异常MQ配置
  • 🌟异常MQ消费者
  • 🌟注意
  • 🌟写在最后

    🌟架构图

    在这里插入图片描述


    🌟application.properties

    ##----------rabbit配置--------------
    spring.rabbitmq.host=49.233.48.98
    spring.rabbitmq.port=5672
    #需要手工创建虚拟主机
    spring.rabbitmq.virtual-host=dev
    spring.rabbitmq.username=admin
    spring.rabbitmq.password=password
    #消息确认方式,manual(手动ack) 和auto(自动ack); 消息消费重试到达指定次数进到异常交换机和异常队列,需要改为自动ack确认消息
    spring.rabbitmq.listener.simple.acknowledge-mode=auto
    #开启重试,消费者代码不能try catch捕获异常,要抛出异常
    spring.rabbitmq.listener.simple.retry.enabled=true
    #最大重试次数
    spring.rabbitmq.listener.simple.retry.max-attempts=4
    # 重试消息的时间间隔,5秒
    spring.rabbitmq.listener.simple.retry.initial-interval=5000
    

    🌟异常MQ配置

    @Configuration
    @Slf4j
    public class ErrorRabbitMQConfig {
        /**
         * 异常交换机
         */
        private String errorExchange="error.exchange";
        /**
         * 异常队列
         */
        private String errorQueue="error.queue";
        private String errorRoutingKey="error.routing.key";
        @Autowired
        private RabbitTemplate rabbitTemplate;
        /**
         * 创建异常交换机
         * @return
         */
        @Bean
        public TopicExchange errorTopicExchange(){
            return new TopicExchange(errorExchange,true,false);
        }
        /**
         * 创建异常队列
         * @return
         */
        @Bean
        public Queue errorQueue(){
            return new Queue(errorQueue,true);
        }
        /**
         * 建立绑定关系
         * @return
         */
        @Bean
        public Binding bindingErrorQueueAndExchange(){
            return BindingBuilder.bind(errorQueue()).to(errorExchange()).with(errorRoutingKey);
        }
        /**
        *消息重新发布到异常MQ
        */
        @Bean
        public MessageRecoverer messageRecoverer(){
            return new RepublishMessageRecoverer(rabbitTemplate,errorExchange,errorRoutingKey);
        }
    }
    

    🌟异常MQ消费者

    @Component
    @Slf4j
    @RabbitListener(queuesToDeclare = { @Queue("error.queue") })
    public class ErrorMQListener {
        @RabbitHandler
        private void errorMessageHandler(EventMessage eventMessage, Message message, Channel channel) throws IOException {
            log.info("监听到消息:{}",message);
            //进行消息消费
            //发送邮箱通知、告警服务
        }
    }
    

    🌟注意

    1. 业务MQ消费者代码逻辑记得往外抛异常,进行try-catch了也要往外抛。
    2. 消息消费重试,达到重试次数进入到异常交换机、队列。消息确认方式需要改为自动ack。

    🌟写在最后

    有关于项目实战之RabbitMQ重试机制进行消息补偿通知到此就结束了。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


    请添加图片描述