掌控消息全链路(4)——RabbitMQ/Spring-AMQP高级特性详解之事务与消息分发


🔥我的主页: 九转苍翎
⭐️个人专栏: 《Java SE》 《Java集合框架系统精讲》 《MySQL高手之路:从基础到高阶》 《计算机网络》 《Java工程师核心能力体系构建》 《RabbitMQ理论与实践》
天行健,君子以自强不息。


1.事务

AMQP(高级消息队列协议)实现了事务机制,主要用于确保消息的原子性发布和确认。换言之,它允许你将多个操作(如发送消息、确认消息)绑定在一起,要么全部成功,要么全部失败

  • 配置队列

    java 复制代码
    @Configuration
    public class RabbitMQConfig {
        @Bean("transQueue")
        public Queue transQueue(){
            return QueueBuilder.durable(Constants.TRANS_QUEUE).build();
        }
    }
  • 配置RabbitTemplate和事务管理器

    java 复制代码
    @Configuration
    public class RabbitTemplateConfig {
        @Bean("transRabbitTemplate")
        public RabbitTemplate transRabbitTemplate(ConnectionFactory connectionFactory) {
            RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
            rabbitTemplate.setChannelTransacted(true);
            return rabbitTemplate;
        }
    
        @Bean
        public RabbitTransactionManager rabbitTransactionManager(ConnectionFactory connectionFactory){
            return new RabbitTransactionManager(connectionFactory);
        }
    }
  • 发送消息

    java 复制代码
    @RestController
    @RequestMapping("/producer")
    public class ProducerController {
        @Resource(name = "transRabbitTemplate")
        private RabbitTemplate transRabbitTemplate;
        
        @Transactional
        @RequestMapping("/trans")
        public String trans(){
            transRabbitTemplate.convertAndSend("",Constants.TRANS_QUEUE, "trans test ---> 1");
            int num = 5 / 0;
            transRabbitTemplate.convertAndSend("",Constants.TRANS_QUEUE, "trans test ---> 2");
            return "发送成功";
        }
    }


    Spring Boot的RabbitMQ自动配置默认会确认模式,但RabbitMQ不允许同一个通道同时使用事务模式和确认模式,所以需要确保publisher confirms被禁用

    yaml 复制代码
    spring:
      rabbitmq:
        publisher-confirm-type: none
        publisher-returns: false

2.消息限流

消息限流(Flow Control) 是RabbitMQ防止生产者发送消息速度超过消费者处理能力,导致消息积压和系统崩溃的保护机制

  • 声明和配置交换器、队列和绑定关系

    java 复制代码
    @Configuration
    public class RabbitMQConfig {
        @Bean("qosQueue")
        public Queue qosQueue(){
            return QueueBuilder.durable(Constants.QOS_QUEUE).build();
        }
        @Bean("qosExchange")
        public DirectExchange qosExchange(){
            return ExchangeBuilder.directExchange(Constants.QOS_EXCHANGE).build();
        }
        @Bean("qosBinding")
        public Binding qosBinding(@Qualifier("qosExchange") DirectExchange directExchange,@Qualifier("qosQueue") Queue queue){
            return  BindingBuilder.bind(queue).to(directExchange).with("qos");
        }
    }
  • 限制每个消费者未确认的最大消息数

    yaml 复制代码
    spring:
      rabbitmq:
        listener:
          simple:
            acknowledge-mode: manual # 消费者确认机制
            prefetch: 5
  • 配置消费者

    java 复制代码
    @Component
    @Slf4j
    public class QosListener {
        @RabbitListener(queues = Constants.QOS_QUEUE)
        public void handMessage(Message message, Channel channel) throws IOException {
            long deliveryTag = message.getMessageProperties().getDeliveryTag();
            try{
                log.info("接收到消息:{},deliveryTag:{}",
                        new String(message.getBody(), StandardCharsets.UTF_8),
                        deliveryTag);
                log.info("处理成功");
                // channel.basicAck(deliveryTag, true); // 消费者不确认消息
            }catch(Exception e){
                channel.basicNack(deliveryTag,true,true);
            }
        }
    }
  • 发送消息

    java 复制代码
    @RestController
    @RequestMapping("/producer")
    public class ProducerController {
        @Resource(name = "rabbitTemplate")
        private RabbitTemplate rabbitTemplate;
        
        @RequestMapping("/qos")
        public String qos(){
            for (int i = 0; i < 20; i++) {
                rabbitTemplate.convertAndSend(Constants.QOS_EXCHANGE, "qos", "qos test:" + i);
            }
            return "发送成功";
        }
    }
相关推荐
paopaokaka_luck3 小时前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
软件技术NINI5 小时前
基于SpringBoot和Vue的摇滚乐鉴赏网站
vue.js·spring boot·后端·spring·html·毕业设计·毕设
学长毕设5 小时前
基于SpringBoot的校园礼服租赁系统的设计与实现
java·spring boot·后端
计算机毕设定制辅导-无忧学长5 小时前
《基于物品协同过滤的闲置书换购微信小程序设计开发》
java·vue.js·spring boot·微信小程序·uniapp·闲置书换购微信小程序·物品协同过滤算法
Best_Liu~5 小时前
SpringBoot全局日期格式化
java·spring boot·后端
RuoyiOffice6 小时前
SpringBoot3 + openGauss:RuoYi Office 登录、流程发布与用印填报适配实战
java·数据库·spring boot·opengauss·信创
Dwzun6 小时前
基于SpringBoot3+Vue3的油莎豆种植管理系统
java·前端·vue.js·spring boot·后端·python·计算机网络
学长毕设14 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw16 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号16 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统