RabbitMQ详解(四):SpringBoot整合MQ

news2024/11/15 1:48:52

SpringBoot整合MQ

需要创建两个springboot项目,一个springboot_rabbitmq_producer生产者,一个springboot_rabbitmq_consumer消费者

fanout模式(配置文件方式)

定义生产者

  • 创建生产者工程 springboot_rabbitmq_producer

    在这里插入图片描述

  • pom.xml文件中添加依赖

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-amqp</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.amqp</groupId>
                <artifactId>spring-rabbit-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
  • application.yml文件配置

    # 服务端口
    server:
      port: 8080
    # 配置rabbitmq服务
    spring:
      rabbitmq:
        username: admin
        password: admin
        virtual-host: /
        host: 请填写自己的IP地址
        port: 5672
    
  • 生产者代码

    package com.cn.service;
    
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import java.util.UUID;
    
    @Service
    public class OrderService {
    
        @Autowired	
        /**
         * RabbitTemplate
         * 提供了编辑消息、发送消息、发送消息前的监听、发送消息后的监听等消息制造和消息监听功能,
         * 可以让我们像操作原生 RabbitMQ API 那样在 Spring 中通过 RabbitTemplate 来操作消息并发送和监听消息
         */
        private RabbitTemplate rabbitTemplate;
    
          public void createOrderFanout(String userId, String productId, int num){
            //此处模拟生成订单编号
            String orderId = UUID.randomUUID().toString();
            //定义交换机名称
            String exchangeName  = "fanout-order-exchange";
            //fanout模式不需要routeKey
            String routeKey  = "";
            rabbitTemplate.convertAndSend(exchangeName, routeKey, orderId);
        }
    }
    
  • 绑定关系,基于配置文件的形式

    package com.cn.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.context.annotation.Configuration;
    
    @Configuration
    public class FanoutRabbitmqConfig {
    
        //1.声明交换机
        @Bean
        public FanoutExchange fanoutExchange(){
         return new FanoutExchange("fanout-order-exchange", true, false);
        }
    
        //2.声明队列
        @Bean
        public Queue fanoutEmailQueue(){
            return new Queue("email.fanout.queue", true);
        }
    
        @Bean
        public Queue fanoutSmsQueue(){
            return new Queue("sms.fanout.queue", true);
        }
    
        @Bean
        public Queue fanoutWeixinQueue(){
            return new Queue("weixin.fanout.queue", true);
        }
    
        //3.交换机和队列进行绑定
        @Bean
        public Binding fanoutEmailBinding(){
            return BindingBuilder.bind(fanoutEmailQueue()).to(fanoutExchange());
        }
    
        @Bean
        public Binding fanoutSmsBinding(){
            return BindingBuilder.bind(fanoutSmsQueue()).to(fanoutExchange());
        }
    
        @Bean
        public Binding fanoutWeixinBinding(){
            return BindingBuilder.bind(fanoutWeixinQueue()).to(fanoutExchange());
        }
    }
    
  • 测试代码

    package com.cn;
    
    import com.cn.service.OrderService;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    class SpringbootRabbitmqFanoutProducerApplicationTests {
    
        @Autowired
        private OrderService orderService;
    
        @Test
        void testOrderFanout() {
            orderService.createOrderFanout("1","1",111);
        }
    }
    
  • 启动测试,查看图形化管理界面,可以看到交换机和队列都已创建好并且各投递了一条消息

在这里插入图片描述

在这里插入图片描述

定义消费者

  • 创建消费者工程 springboot_rabbitmq_consumer

    在这里插入图片描述

  • pom.xml文件中添加依赖

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-amqp</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.amqp</groupId>
                <artifactId>spring-rabbit-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
  • application.yml文件配置

    # 服务端口
    server:
      port: 8081
    # 配置rabbitmq服务
    spring:
      rabbitmq:
        username: admin
        password: admin
        virtual-host: /
        host: 请填写自己的IP地址
        port: 5672
    
  • 消费者-邮件服务

    package com.cn.service.fanout;
    
    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Service;
    
    @Service
    /**
     * @RabbitListener
     * 队列已经存在时,直接指定名称即可
     */
    @RabbitListener(queues = "email.fanout.queue")
    public class EmailConsumer {
    
        @RabbitHandler
        public void reviceMessage(String message){
            System.out.println("email.fanout.queue => 接收到了订单信息:" + message);
        }
    }
    
  • 消费者-短信服务

    package com.cn.service.fanout;
    
    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Service;
    
    @Service
    /**
     * @RabbitListener
     * 队列已经存在时,直接指定名称即可
     */
    @RabbitListener(queues = "sms.fanout.queue")
    public class SmsConsumer {
    
        @RabbitHandler
        public void reviceMessage(String message){
            System.out.println("sms.fanout.queue => 接收到了订单信息:" + message);
        }
    }
    
  • 消费者-微信服务

    package com.cn.service.fanout;
    
    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Service;
    
    @Service
    /**
     * @RabbitListener
     * 队列已经存在时,直接指定名称即可
     */
    @RabbitListener(queues = "weixin.fanout.queue")
    public class WeixinConsumer {
    
        @RabbitHandler
        public void reviceMessage(String message){
            System.out.println("weixin.fanout.queue => 接收到了订单信息:" + message);
        }
    }
    
  • 启动消费者,查看日志打印

    在这里插入图片描述

direct模式(配置文件方式)

定义生产者

  • 在上个案例OrderService中修改

     public void createOrderDirect(String useerId, String productId, int num){
          	//此处模拟生成订单编号
            String orderId = UUID.randomUUID().toString();
            //定义交换机名称
            String exchangeName  = "direct-order-exchange";;
            //direct模式需要routeKey
            String routeKey  = "email";
            rabbitTemplate.convertAndSend(exchangeName, routeKey, orderId);
        }
    
  • 绑定关系

    package com.cn.config;
    
    import org.springframework.amqp.core.*;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class DirectRabbitmqConfig {
    
        //1.声明交换机
        @Bean
        public DirectExchange directExchange(){
         return new DirectExchange("direct-order-exchange", true, false);
        }
    
        //2.声明队列
        @Bean
        public Queue directEmailQueue(){
            return new Queue("email.direct.queue", true);
        }
    
        @Bean
        public Queue directSmsQueue(){
            return new Queue("sms.direct.queue", true);
        }
    
        @Bean
        public Queue directWeixinQueue(){
            return new Queue("weixin.direct.queue", true);
        }
    
        //3.交换机和队列进行绑定
        @Bean
        public Binding directEmailBinding(){
            return BindingBuilder.bind(directEmailQueue()).to(directExchange()).with("email");
        }
    
        @Bean
        public Binding directSmsBinding(){
            return BindingBuilder.bind(directSmsQueue()).to(directExchange()).with("sms");
        }
    
        @Bean
        public Binding directWeixinBinding(){
            return BindingBuilder.bind(directWeixinQueue()).to(directExchange()).with("weixin");
        }
    }
    
  • 测试 代码

       @Test
        void testOrderDirect() {
            orderService.createOrderDirect("1","1",222);
        }
    
  • 启动测试,查看图形化管理界面,可以看到交换机和队列都已创建好并且只有email.direct.queue投递了一条消息

    在这里插入图片描述

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kL0fBpb2-1683753215224)(RabbitMQ.assets/image-20230511045758321.png)]

定义消费者

  • 同理对上个案例中的代码进行修改

  • 消费者-邮件服务

    package com.cn.service.direct;
    
    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Service;
    
    @Service
    @RabbitListener(queues = "email.direct.queue")
    public class DirectEmailConsumer {
    
        @RabbitHandler
        public void reviceMessage(String message){
            System.out.println("email.direct.queue => 接收到了订单信息:" + message);
        }
    }
    
  • 消费者-短信服务

    package com.cn.service.direct;
    
    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Service;
    
    @Service
    @RabbitListener(queues = "sms.direct.queue")
    public class DirectSmsConsumer {
    
        @RabbitHandler
        public void reviceMessage(String message){
            System.out.println("sms.direct.queue => 接收到了订单信息:" + message);
        }
    }
    
  • 消费者-微信服务

    package com.cn.service.direct;
    
    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Service;
    
    @Service
    @RabbitListener(queues = "weixin.direct.queue")
    public class DirectWeixinConsumer {
    
        @RabbitHandler
        public void reviceMessage(String message){
            System.out.println("weixin.direct.queue => 接收到了订单信息:" + message);
        }
    }
    
  • 启动消费者,查看日志打印

    在这里插入图片描述

topic模式(注解方式)

定义生产者

  • 在上个案例中修改

      public void createOrderTopic(String useerId, String productId, int num){
            String orderId = UUID.randomUUID().toString();
            String exchangeName  = "topic-order-exchange";
            String routeKey  = "com.email.xxx";
            rabbitTemplate.convertAndSend(exchangeName, routeKey, orderId);
        }
    
  • 此处不进行绑定操作,后面在消费者中使用注解形式去修改

  • 测试代码

    	@Test
        void testOrderTopic() {
            orderService.createOrderTopic("1","1",14);
        }
    
  • 启动测试,查看图形化管理界面,可以看到交换机和队列都已创建好并且只有email.direct.queue和sms.direct.queue各投递了一条消息

    在这里插入图片描述

    在这里插入图片描述

定义消费者

  • 同理对上个案例中的代码进行修改

  • 消费者-邮件服务

    package com.cn.service.topic;
    
    import org.springframework.amqp.core.ExchangeTypes;
    import org.springframework.amqp.rabbit.annotation.*;
    import org.springframework.stereotype.Service;
    
    @Service
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "email.topic.queue", durable = "true", autoDelete = "false"),
            exchange = @Exchange(value = "topic-order-exchange", type = ExchangeTypes.TOPIC),
            key = "#.email.#"
    ))
    public class TopicEmailConsumer {
    
        @RabbitHandler
        public void reviceMessage(String message){
            System.out.println("email.topic.queue => 接收到了订单信息:" + message);
        }
    }
    
  • 消费者-短信服务

    package com.cn.service.topic;
    
    import org.springframework.amqp.core.ExchangeTypes;
    import org.springframework.amqp.rabbit.annotation.*;
    import org.springframework.stereotype.Service;
    
    @Service
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "sms.topic.queue", durable = "true", autoDelete = "false"),
            exchange = @Exchange(value = "topic-order-exchange", type = ExchangeTypes.TOPIC),
            key = "com.#"
    ))
    public class TopicSmsConsumer {
    
        @RabbitHandler
        public void reviceMessage(String message){
            System.out.println("sms.topic.queue => 接收到了订单信息:" + message);
        }
    
    }
    
    
  • 消费者-微信服务

    package com.cn.service.topic;
    
    import org.springframework.amqp.core.ExchangeTypes;
    import org.springframework.amqp.rabbit.annotation.*;
    import org.springframework.stereotype.Service;
    
    @Service
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "weixin.topic.queue", durable = "true", autoDelete = "false"),
            exchange = @Exchange(value = "topic-order-exchange", type = ExchangeTypes.TOPIC),
            key = "*.weixin.#"
    ))
    public class TopicWeixinConsumer {
    
        @RabbitHandler
        public void reviceMessage(String message){
            System.out.println("weixin.topic.queue => 接收到了订单信息:" + message);
        }
    }
    
  • 启动消费者,查看日志打印

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/511987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DragonflyDB 安装使用

前言 全世界最快的内存数据库 Dragonfly是一种针对现代应用程序负荷需求而构建的内存数据库&#xff0c;完全兼容Redis和Memcached的 API&#xff0c;迁移时无需修改任何代码。相比于这些传统的内存数据库&#xff0c;Dragonfly提供了其25倍的吞吐量&#xff0c;高缓存命中率和…

演化博弈模型简介

演化博弈模型简介 文章目录 演化博弈模型简介[toc]1 演化博弈思想2 演化博弈关注的问题3 复制动态中的博弈 1 演化博弈思想 传统博弈苛刻假设&#xff1a; 完全理性完全信息 演化博弈论&#xff1a;演化博弈论(Evolutionary Game Theory)把博弈理论分析和动态演化过程分析结…

【python】Pandas库用法详解!

pandas 是基于NumPy 的一种工具&#xff0c;该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型&#xff0c;提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现&#xff0c;它是使Py…

Android系统启动流程(三)——属性服务

1 属性服务 属性服务的启动在init进程中&#xff0c;init进程初始化的第二阶段初始化中启动了属性服务。 system/core/init/init.cpp int SecondStageMain(int argc, char** argv) {...PropertyInit();...StartPropertyService(&property_fd);...2 启动属性服务 system/…

Win系统软件闪屏/Edge闪屏/Office闪屏 - 解决方案

Win系统软件闪屏/Edge闪屏/Office闪屏 - 解决方案 前言原因解决方案方案1&#xff08;推荐&#xff09;&#xff1a;重新安装核显驱动方案2&#xff1a;软件使用独显方案3&#xff1a;软件关闭硬件加速 前言 使用Win10及以上系统时&#xff0c;可能会出现频繁闪现黑屏的状态&a…

【jupyter】mac os系统下的jupyter的实用技巧

Jupyter notebook是一个开源的web应用&#xff0c;可以让你创建和分享包含代码、公式、可视化和叙述文本的文档。它可以用于数据清洗和转换、数值模拟、统计建模、数据可视化、机器学习等多种用途。 在mac os系统下&#xff0c;有多种方法可以安装jupyter notebook&#xff0c…

十大生产力神器,包括5大jupyter插件和五个提升python研发生产力的神器

JupyterLab&#xff1a;一款下一代的笔记本界面&#xff0c;支持多种编程语言&#xff0c;包括python。它具有灵活的界面&#xff0c;可以配置和安排数据科学、科学计算、计算新闻和机器学习等领域的工作流程。 Voil&#xff1a;一款可以将笔记本转换为安全、独立的web应用程序…

将字符串数组转换为字符串类型

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 当你在Java编程中需要将一个字符数组转换为字符串类型时&#xff0c;你可以使用Java内置的String类提供的方法。在本文中&#xff0c;笔者将介绍两种将字符数组转换为…

RabbitMQ详解(二):消息模式 Simple(简单)模式

消息模式 Simple(简单)模式 前提&#xff0c;开放5672:RabbitMQ的通讯端口&#xff0c;及查看创建用户的权限 构建maven工程 导入依赖 依赖下载地址: https://mvnrepository.com/artifact/com.rabbitmq/amqp-client <dependency><groupId>com.rabbitmq</group…

协议:HTTP基础内容掌握

一、简单理解 HTTP HTTP 协议一般指 HTTP&#xff08;超文本传输协议 Hyper Text Transfer Protocol&#xff09;。 HTTP是一个简单的请求/响应协议&#xff0c;它运行在TCP之上。 HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;HTML 文件, 图片文件, 查询结果等&#x…

活动预告 Flutter 之夜 | Flutter Night Beijing

Flutter 是一个开源、可移植的 UI 框架&#xff0c;它为开发人员提供了超能力&#xff0c;可以从单个代码库为任何平台构建美观、高质量的应用程序。它将统一代码库和快速迭代开发的生产力与本机编译和硬件加速渲染的性能和功能相结合。Flutter 今天支持的平台包括安卓&#xf…

简单随机微分方程数值解

1.随机微分方程求解&#xff1a;dX(t) − αXtdt σdWt 法一&#xff1a;Euler-Maruyama %% %O-U过程 %dX(t)-alpha*Xt*dtsigma*dWt,X|t0X0 %alpha2,sigma1,X01 % 设置初始参数 T 1; % 时间区间长度 N 1000; % 离散化的时间步数 dt T/N; …

[医学分割比赛] ISBI2023 APIS多模态医学分割比赛总结 + top3解决方案

ISBI2023 APIS多模态医学分割比赛总结 top3解决方案 0.比赛背景1.比赛任务及结果2.第三名方案 - 龙盈智达&#xff08;北京&#xff09;科技有限公司(0) Data Preprocessing(1) Data Augmentation(2) Approach&#xff08;Model&#xff09;(3) Approach(Data Sampling)(4) Ap…

【QT】学习课-pushButton的使用(1)!

Qt 是一个1991年由Qt Company开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序&#xff0c;也可用于开发非GUI程序&#xff0c;比如控制台工具和服务器。Qt是面向对象的框架&#xff0c;使用特殊的代码生成扩展&#xff08;称为元对象编译器(Meta Object Compi…

《WebGIS快速开发教程》写好啦

告诉大家一个好消息&#xff0c;经过我没日没夜&#xff0c;呕心沥血的创作&#xff0c;这本叫做《WebGIS快速开发教程》的书籍终于写好了。这本书适用于还未毕业的学生、以及正在从事传统前后端开发但是想转到WebGIS开发的人。 这本书的特点突出一个“快”和“轻”&#xff0c…

三子棋小游戏---(C语言)

目录 前言&#xff1a; 1.菜单的打印 2.三子棋构思 3.实现三子棋 3.1使用宏的方式定义数组 3.2打印棋盘 3.3玩家下棋 3.4电脑随机下棋 3.5判断结局 ❤博主CSDN:啊苏要学习 ▶专栏分类&#xff1a;C语言◀ C语言的学习&#xff0c;是为我们今后学习其它语言打好基础&am…

Kyligence Zen产品体验——一站式指标平台泰酷辣~

文章目录 一、前言二、为什么需要指标化平台三、什么是Kyligence Zen四、Kyligence Zen新特性五、Kyligence Zen注册篇六、Kyligence Zen体验篇七、Kyligence Zen实战篇7.1 导入数据7.2 创建指标7.3 指标分析 八、Kyligence Zen总结篇九、参考资料 一、前言 随着互联网和物联网…

tomcat集群下的session共享和负载均衡(redis实现)

环境 操作系统&#xff1a;windows tomcat1&#xff1a;Apache Tomcat/7.0.52&#xff08;8085&#xff09; tomcat2&#xff1a;Apache Tomcat/7.0.52&#xff08;8086&#xff09; jre&#xff1a;1.7.0_80 nginx&#xff1a;nginx-1.20.1&#xff08;8070&#xff09; redis…

基于 SpringBoot+WebSocket 无DB实现在线聊天室(附源码)

文章目录 基于 SpringBootWebSocket 无DB实现在线聊天室0 项目说明0.1 样例展示0.2 源码地址 1 WebSocket 简介1.1 HTTP1.2 WebSocket1.2.1 WebSocket 协议1.2.2 WebSocket 交互 2 使用教程2.1 客户端&#xff08;浏览器&#xff09;2.1.1 WebSocket 对象2.1.2 WebSocket 事件2…

重装系统后,qt5.11.3升级到qt5.12.6所遇到的问题

前提&#xff1a;重装了系统&#xff1a; c/qt windows10 语音模块TTS异常&#xff0c;数据库缺少驱动 一&#xff1a;语音模块不能播放 qt使用语音模块时&#xff0c;在初始化时出现异常&#xff1a; onecore\com\combase\dcomrem\resolver.cxx(2299)\combase.dll!00007FF8…