首页 > 其他分享 >RabbitMQ 07 发布订阅模式

RabbitMQ 07 发布订阅模式

时间:2023-04-02 20:55:41浏览次数:41  
标签:订阅 return 07 队列 springframework Queue RabbitMQ import org

发布订阅模式

发布订阅模式结构图:

比如信用卡还款日临近了,那么就会给手机、邮箱发送消息,提示需要去还款了,但是手机短信和邮件发送并不一定是同一个业务提供的,但是现在又希望能够都去执行,就可以用到发布订阅模式,简而言之就是,发布一次,消费多个

实现这种模式需要用到另一种类型的交换机,叫做fanout(扇出)类型,这是一种广播类型,消息会被广播到所有与此交换机绑定的消息队列中。

这里使用默认的扇出交换机:

  1. 定义配置类。

    import org.springframework.amqp.core.Binding;
    import org.springframework.amqp.core.BindingBuilder;
    import org.springframework.amqp.core.Exchange;
    import org.springframework.amqp.core.ExchangeBuilder;
    import org.springframework.amqp.core.Queue;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * RabbitMQ配置类
     */
    @Configuration
    public class RabbitMqConfig {
        
        /**
         * 定义交换机,可以很多个
         * @return 交换机对象
         */
        @Bean
        public Exchange fanoutExchange(){
            return ExchangeBuilder.fanoutExchange("amq.fanout").build();
        }
    
        /**
         * 定义消息队列
         * @return 消息队列对象
         */
        @Bean
        public Queue fanoutQueue1(){
            return new Queue("fanoutQueue1");
        }
    
        /**
         * 定义绑定关系
         * @return 绑定关系
         */
        @Bean
        public Binding binding1(@Qualifier("fanoutExchange") Exchange exchange,
                                @Qualifier("fanoutQueue1") Queue queue){
            // 将定义的交换机和队列进行绑定
            return BindingBuilder
                    // 绑定队列
                    .bind(queue)
                    // 到交换机
                    .to(exchange)
                    // 使用自定义的routingKey
                    .with("")
                    // 不设置参数
                    .noargs();
        }
    
        /**
         * 定义消息队列
         * @return 消息队列对象
         */
        @Bean
        public Queue fanoutQueue2(){
            return new Queue("fanoutQueue2");
        }
    
        /**
         * 定义绑定关系
         * @return 绑定关系
         */
        @Bean
        public Binding binding(@Qualifier("fanoutExchange") Exchange exchange,
                               @Qualifier("fanoutQueue2") Queue queue){
            // 将定义的交换机和队列进行绑定
            return BindingBuilder
                    // 绑定队列
                    .bind(queue)
                    // 到交换机
                    .to(exchange)
                    // 使用自定义的routingKey
                    .with("")
                    // 不设置参数
                    .noargs();
        }
    }
    
  2. 定义消费者。

    import org.springframework.amqp.rabbit.annotation.Queue;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;
    
    /**
     * 发布订阅监听器
     */
    @Component
    public class FanoutListener {
    
        @RabbitListener(queuesToDeclare = {@Queue("fanoutQueue1")})
        public void receiver1(String message) {
            System.out.println("1号监听器:" + message);
        }
    
        @RabbitListener(queuesToDeclare = {@Queue("fanoutQueue2")})
        public void receiver2(String message) {
            System.out.println("2号监听器:" + message);
        }
    }
    
    

    为了避免监听时没有该队列而报错,可以采用queuesToDeclare = {@Queue("队列名称")}的形式,这样如果没有该队列会自动创建该队列。

  3. 定义生产者。

    import org.junit.jupiter.api.Test;
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import java.util.concurrent.TimeUnit;
    
    @SpringBootTest
    class RabbitMqSpringBootTests {
    
        /**
         * RabbitTemplate封装了大量的RabbitMQ操作,已经由Starter提供,因此直接注入使用即可
         */
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        /**
         * 生产者
         */
        @Test
        void producer()  {
    
            rabbitTemplate.convertAndSend("amq.fanout", "", "Hello World");
        }
    
    }
    
    
  4. 启动生产者,发送消息。

    可以看到,发送一条消息,两个消费者都收到了消息,这就是发布订阅模式。


标签:订阅,return,07,队列,springframework,Queue,RabbitMQ,import,org
From: https://www.cnblogs.com/codesail/p/17281331.html

相关文章

  • 202031607129-杨炜 实验一 软件工程准备—博客园技巧与博客首秀
    项目内容班级博客链接2023年春软件工程(2020级计算机科学与技术本次作业要求链接实验一软件工程准备我的课程学习目标注册博客园和Github账号,学习使用博客园,了解Github的基本操作。本次作业在哪些方面帮我实现学习目标按照实验内容,借助各种链接的例子,一步步......
  • 202031607221-王彦润 实验一 软件工程准备—博客园技巧与博客首秀
    1、项目和内容简介项目内容班级博客链接2023年春软件工程本次作业要求链接实验一我的课程学习目标注册博客园和Github账号,学习使用博客园,了解Github的基本操作本次作业在哪些方面帮我实现学习目标1.初步了解博客园软件和Github的基本操作;初步了解学......
  • 202031607128-张政文 实验一 软件工程准备
    1、项目和内容简介项目内容班级博客链接2023年春软件工程(2020级计算机科学与技术)(西北师范大学-计算机科学与工程学院)本次作业要求链接实验一软件工程准备我的课程学习目标注册博客园和Github账号,学习使用博客园,了解Github的基本操作。本次作业在哪些......
  • 202031607230-王格 实验一 软件工程准备--构建之法与博客首秀
    实验一软件工程准备项目内容班级博客链接2023年春软件工程本次作业要求链接实验一软件工程准备我的课程学习目标1.学习博客园软件开发者学习社区使用技巧和经验。2.了解Github工具的基本操作3.阅读《现代软件工程—构建之法》,深入了解什么是软件工程......
  • 202031607327-杨辽辽 实验一 软件工程准备 初步了解软件工程
    202031607327-杨辽辽实验一软件工程准备初步了解软件工程项目内容班级博客链接20级卓越班本次作业要求链接实验一软件工程准备我的课程学习目标1.学习博客园软件开发者学习社区使用技巧和经验;2.了解Github的基本操作;本次作业在哪些方面帮我实现学习......
  • RabbitMQ下载与安装
    1.首先进入rabbitmq官网找,查看rabbitmq对应的erlang之间对应的版本信息网址:RabbitMQErlangVersionRequirements—RabbitMQ网站看不懂的话可以使用windows系统最新的edge浏览器,有翻译功能.2.在github网站下载erlang的.npm文件(文件下载可能较慢,耐心等待)网址:http......
  • 202031607323-后涌- 实验一 软件工程准备—什么是软件?什么是工程?
    项目内容班级博客链接班级链接本次作业要求链接作业要求我的课程学习目标了解掌握软件在开发过程中的过程、方法和工具本次作业在哪些方面帮我实现学习目标准备学习软件工程的工具任务1:调查问卷在以下网址提交课程调查问卷完成情况:已认真填写并提......
  • 202031607224-邓思超 实验一 软件工程准备—认识软件工程
    实验一软件工程准备项目内容班级博客链接班级博客本次作业要求链接本次作业要求链接我的课程学习目标(1)学习博客园软件开发者学习社区使用技巧和经验。(2)了解Github的基本操作。本次作业在哪些方面帮我实现学习目标(1)通过博客园阅读了专业相关的一些博客内容......
  • 202031607225-王淑慧 实验一 软件工程准备-前期工作及预习
    实验一软件工程准备项目内容班级博客链接2023年春软件工程20级卓越班本次作业要求链接实验一软件工程准备我的课程学习目标1:学习博客园软件开发,社区使用技巧和经验2:了解Github的基本操作3:学习《现代软件工程——构建之法》本次作业在那些方面帮我实现学......
  • 202031607203-杜颖 实验一 软件工程准备 初步认识软件工程
    实验一软件工程准备项目内容班级博客链接https://edu.cnblogs.com/campus/xbsf/2020CSSE本次作业要求链接https://edu.cnblogs.com/campus/xbsf/2020CSSE/homework/12938我的课程学习目标学习软件工程的相关知识本次作业在哪些方面帮我实现学习目标学习博......