• Springboot 2.3.7.RELEASE 结合 amqp 实现 RabbitMQ 的 direct 模式(路由模式)


    参考

    1. 《Spring Boot实战派》
    2. 消息队列RabbitMQ入门与5种模式详解(讲解了用户权限的问题,可以看一看)
    3. springboot(集成篇):RabbitMQ集成详解

    必看

    • 如果要发送对象,发送的对象需要继承 Serializable
    • 可以创建多个消费者,消息会均匀的分配给消费者
      image
    • 任务失败后会自动重试,建议自己处理一下这方面的问题

    建议

    环境

    • Springboot 2.3.7.RELEASE
    • amqp(pom.xml内添加,未设置具体版本)
    • otp_win64_24.1.7(win安装文件)
    • rabbitmq-server-3.9.10(win安装文件)

    正文

    1. pom.xml添加依赖
    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-amqp</artifactId>
            </dependency>
    </dependencies>
    
    1. 创建配置类、声明队列并绑定队列
    /**
     * 配置mq交换器及声明队列
     * @Author 夏秋初
     * @Date 2021/11/27 19:48
     */
    @Configuration
    public class RabbitConfig {
        /**
         * 声明email队列
         * @return
         */
        @Bean
        public Queue userEmailVerify() {
            // true表示持久化该队列
            return new Queue("user.email.verify", true);
        }
    
    //    /**
    //     * 声明交互器 topic
    //     * @return
    //     */
    //    @Bean
    //    TopicExchange topicExchange() {
    //        return new TopicExchange("topicExchange");
    //    }
        /**
         * 声明交互器/交换机 direct
         * @return
         */
        @Bean
        DirectExchange directExchange() {
            return new DirectExchange("direct.exchange");
        }
    
        /**
         * 绑定email队列,并设置路由key,如果还有别的队列,再创建一个函数绑定即可
         * @return
         */
        @Bean
        public Binding bindingUserEmailVerify() {
            return BindingBuilder.bind(userEmailVerify()).to(directExchange()).with("user.email.verify");
        }
    }
    
    1. 创建生产者(书上说可以发送对象,这边测试会报错不支持的格式,待文章写完后再解决)
    
    /**
     * 发送者
     * @Author 夏秋初
     * @Date 2021/11/27 19:54
     */
    @Component
    public class UserEmailVerifyProducer {
        @Resource
        private AmqpTemplate amqpTemplate;
        /**
         * 发送邮件队列
         * @param userVerificationCodeEmailDto
         */
        public void sendEmail(UserEmailVerifyDto userVerificationCodeEmailDto){
            System.out.println("生产者 user.email.verify 发送消息: "+userVerificationCodeEmailDto);
            /**
             * 第一个参数指定交换机
             * 第二个参数指定队列
             * 第三个参数指定消息内容
             */
            amqpTemplate.convertAndSend("direct.exchange", "user.email.verify", userVerificationCodeEmailDto.toString());
    
        }
    }
    
    
    1. 创建消费者
    /**
     * 消费者
     * @Author 夏秋初
     * @Date 2021/11/27 20:23
     */
    @Component
    // 监听指定队列 
    @RabbitListener(queues = "user.email.verify")
    public class UserEmailVerifyConsumer {
        @RabbitHandler
        public void process(String content){
                System.out.println("消费者 user.email.verify  收到消息: "+content
            );
        }
    }
    
    1. 用户实体
    /**
     * @Author 夏秋初
     * @Date 2021/11/27 20:00
     */
    @Data
    public class UserEmailVerifyDto implements Serializable {
        private String email;
        private Integer code;
        private String content = "您的邮箱验证码为:%d,请不要告诉别人哦";
    }
    
    
    1. application.properties 配置文件内添加配置参数
    # 如果访问局域网的mq服务,需要配置账户并允许远程访问 ,参考:https://www.cnblogs.com/xiaqiuchu/p/15616432.html
    spring.rabbitmq.host=192.168.211.2
    # 指定端口号
    spring.rabbitmq.port=5672
    # 指定账号,默认账号不可以在其他机器登录
    spring.rabbitmq.username=testmail
    # 指定密码
    spring.rabbitmq.password=testmail
    

    测试

    1. 运行本项目
    2. 访问控制台可以看到该交换机
      image
    3. 点击进入交换机详情可以看到交换机内部的队列
      image
    4. 测试发送消息显示消费者接受到
      image
    如果觉得文章对您有帮助,希望您能 关注+推荐 哦
  • 相关阅读:
    VBA基础四:数据库链接(WPS2019)
    VBA基础三:循环(DO...LOOP,)
    随机多人红包
    概率抽奖
    七步轻松实现大数据库表的数据转储
    SQL Server中的行列倒置技巧
    把对应表的字段跨表赋值
    sql内日期格式化输出
    事务的用法
    女孩,你为什么不沉住气奋斗
  • 原文地址:https://www.cnblogs.com/xiaqiuchu/p/15618485.html
Copyright © 2020-2023  润新知