RabbitMQ深度探索:SpringBoot 整合 RabbitMQ

需创建复合项目
父工程 Maven 依赖:
XML 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
  </parent>


<!--  父工程要打成 pom 包-->
  <groupId>com.qcby</groupId>
  <artifactId>springboot-rabbitmq</artifactId>
  <packaging>pom</packaging>
  <modules>
    <module>producer</module>
    <module>sms-consumer</module>
  </modules>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <!-- springboot-web组件 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 添加springboot对amqp的支持 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
    </dependency>
    <!--fastjson -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.49</version>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>

  </dependencies>
生产者工程代码:
  1. 配置类:

    java 复制代码
    package com.qcby.config;
    
    import org.springframework.amqp.core.Binding;
    import org.springframework.amqp.core.BindingBuilder;
    import org.springframework.amqp.core.FanoutExchange;
    import org.springframework.amqp.core.Queue;
    import org.springframework.context.annotation.Bean;
    import org.springframework.stereotype.Component;
    
    
    @Component
    public class RabbitMQConfig {
    
        //定义交换机
        private String EXCHANGE_SPRINGBOOT_NAME = "boyatop_ex";
    
        //定义短信队列
        private String FANOUT_SMS_QUEUE = "fanout_sms_queue";
    
        //定义邮件队列
        private String FANOUT_EMAIL_QUEUE = "fanout_email_queue";
    
        //配置邮件队列
        @Bean
        public Queue emailQueue(){
            return new Queue(FANOUT_EMAIL_QUEUE);
        }
    
        //配置消息队列
        @Bean
        public Queue smsQueue(){
            return new Queue(FANOUT_SMS_QUEUE);
        }
    
        //配置交换机
        @Bean
        public FanoutExchange fanoutExchange(){
            return new FanoutExchange(EXCHANGE_SPRINGBOOT_NAME);
        }
    
        //将队列绑定交换机
        @Bean
        public Binding bindingSmsFanoutExchange(Queue smsQueue,FanoutExchange fanoutExchange){
            return BindingBuilder.bind(smsQueue).to(fanoutExchange);
        }
    
        @Bean
        public Binding bindingEmailFanoutExchange(Queue emailQueue,FanoutExchange fanoutExchange){
            return BindingBuilder.bind(emailQueue).to(fanoutExchange);
        }
    }
  2. 消息实体类:

    java 复制代码
    package com.qcby.entity;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.io.Serializable;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class MsgEntity implements Serializable {
        private String MsgId;
        private String UserId;
        private String phone;
        private String email;
    }
  3. 生产者代码:

    java 复制代码
    package com.qcby.controller;
    
    import com.qcby.entity.MsgEntity;
    import org.springframework.amqp.core.AmqpTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.UUID;
    
    @RestController
    public class FanoutProducer {
        @Autowired
        private AmqpTemplate amqpTemplate;
    
        /**
         * 发送消息
         *
         * @return
         */
        @RequestMapping("/sendMsg")
        public String sendMsg() {
            /**
             * 1.交换机名称
             * 2.路由key名称
             * 3.发送内容
             */
            MsgEntity msgEntity = new MsgEntity(UUID.randomUUID().toString(),"22","12345","edddd");
            amqpTemplate.convertAndSend("boyatop_ex", "", msgEntity);
            return "success";
        }
    }
  4. yml 文件:

    java 复制代码
    spring:
      rabbitmq:
        ####连接地址
        host: 127.0.0.1
        ####端口号
        port: 5672
        ####账号
        username: guest
        ####密码
        password: guest
        ### 地址
        virtual-host: boyatopVirtualHost
消费者工程代码:
  1. 实体类:

    java 复制代码
    package com.qcby.entity;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.io.Serializable;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class MsgEntity implements Serializable {
        private String MsgId;
        private String UserId;
        private String phone;
        private String email;
    }
  2. 监听队列:

    java 复制代码
    package com.qcby.controller;
    
    import com.qcby.entity.MsgEntity;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;
    
    @Slf4j
    @Component
    @RabbitListener(queues = "fanout_sms_queue")
    public class smsController {
    
        @RabbitHandler
        public void listen(MsgEntity msgEntity){
            log.info("email:" + msgEntity);
            System.out.println(msgEntity);
        }
    }
  3. yml 文件:

    java 复制代码
    spring:
      rabbitmq:
        ####连接地址
        host: 127.0.0.1
        ####端口号
        port: 5672
        ####账号
        username: guest
        ####密码
        password: guest
        ### 地址
        virtual-host: boyatopVirtualHost
    server:
      port: 8081

生产者如何获取消费结果:

根据业务来定:
  1. 消费者消费成功结果:能够在数据库中插入一条数据
Roketmq 自带全局消息 id,能够根据该全局消息获取消费结果
  1. 异步返回一个全局 id,前端使用 ajax 定时主动查询
  2. 在roketmq 中,自带根据消息 id 查询是否消费成功
原理:
  1. 生产者投递消息 MQ 服务器,NQ 服务器端在这时候返回一个全局消息 id ,当消费者消费该消息之后,消费者会给我们 MQ 服务器发送通知,标识该消息消费成功
  2. 生产者获取到该消息全局 id,每隔 2s 时间调用 MQ 服务器接口查询是否有被消费成功
相关推荐
今年下半年2 小时前
【短信发送】Spring Boot整合多种短信接口的实现(附源码)
java·spring boot·后端·sms·qcloudsms
ly76893 小时前
PostgreSQL JSONB 在 Spring Boot 中的读写边界:从 JDBC 类型映射到 GIN 索引失效
spring boot·postgresql·gin·jsonb·pgjdbc·gin 索引
IT研究室3 小时前
最新计算机毕业设计选题推荐-基于spring boot的美食配送平台-网站-文档指导-Java-springboot
java·spring boot·课程设计
省钱兄--zs5 小时前
无人自助拼豆系统架构设计与功能实现落地部署全流程实战指南
java·数据仓库·spring boot·系统架构·需求分析
vx_bisheyuange6 小时前
基于SpringBoot的农产品电商平台
spring boot·毕业设计
霸道流氓气质6 小时前
MinIO 入门与实战:S3 兼容对象存储、Spring Boot 集成与 AI 应用文件管理
人工智能·spring boot·后端
威哥爱编程7 小时前
【AI全栈12-07】Spring Boot 用 Agent 自动完成多步运营任务
java·spring boot·后端
RuoyiOffice7 小时前
SpringBoot3+Vue3 员工全生命周期:入转调离如何衔接账号、权限、资产与交接
spring boot·vue3·权限管理·员工管理·hrm·ruoyi office·人事变更
天若有情6738 小时前
从零搭建校园二手交易系统:Vue2 + SpringBoot 4.x 全栈实战
java·spring boot·后端
省钱兄--zs8 小时前
碰碰好评卡系统开发实战指南 核心功能实现与部署落地全流程拆解
数据仓库·经验分享·spring boot·小程序·架构