【RabbitMQ】Spring整合RabbitMQ、Spring实现RabbitMQ五大工作模式(万字长文)

news2025/3/1 22:02:54

目录

一、准备

1、创建maven项目​编辑

2、引入依赖

3、创建配置文件

1.RabbitMQ配置文件

2.生产者项目配置文件

3.消费者项目配置文件

二、生产者xml中文件创建队列

三、生产者xml文件中创建交换机以及绑定队列

1、创建交换机

2、绑定队列 

四、消费者xml文件中创建队列消息监听器

五、Spring实现RabbitMQ五大工作模式

1、简单模式

1.生产者

2.消费者

2、work queues工作队列模式

1.生产者

2.消费者

3、pub/sub订阅模式

1.生产者

2.消费者

4、routing路由模式

1.生产者

2.消费者

5、topics通配符模式

1.生产者

2.消费者


一、准备

1、创建maven项目

2、引入依赖

分别在两个项目的pom.xml文件里引入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>2.1.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.7.RELEASE</version>
        </dependency>
    </dependencies>

3、创建配置文件

1.RabbitMQ配置文件

在两个项目的resources文件夹下创建RabbitMQ的配置文件后缀为yml或properties

创建好文件后将下面配置添加入文件 

rabbitmq.host=127.0.0.1   #IP
rabbitmq.port=5672        #端口
rabbitmq.username=guest   #用户名
rabbitmq.password=guest   #密码
rabbitmq.virtual-host= /  #虚拟机名称

2.生产者项目配置文件

在生产者项目的resources目录下创建xml文件,该文件用于注入bean对象以及后续创建队列、交换机等

在该文件添加下面代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/rabbit
       http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
    <!--设置读取连接RabbitMQ服务器的配置信息-->
    <context:property-placeholder location="classpath:properties/rabbitmq.properties"/>

    <!-- 创建rabbitmq connectionFactory -->
    <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
                               port="${rabbitmq.port}"
                               username="${rabbitmq.username}"
                               password="${rabbitmq.password}"
                               virtual-host="${rabbitmq.virtual-host}"/>
    <rabbit:admin connection-factory="connectionFactory"/>
    

    <!--注入rabbitTemplate后续获取该对象发送消息-->
    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"/>
</beans>

3.消费者项目配置文件

与生产者项目类似创建xml文件,在文件添加以下代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/rabbit
       http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
    <!--加载配置文件-->
    <context:property-placeholder location="classpath:properties/rabbitmq.properties"/>

    <!-- 定义rabbitmq connectionFactory -->
    <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
                               port="${rabbitmq.port}"
                               username="${rabbitmq.username}"
                               password="${rabbitmq.password}"
                               virtual-host="${rabbitmq.virtual-host}"/>
    
    <rabbit:listener-container connection-factory="connectionFactory" auto-declare="true">
        
    </rabbit:listener-container>
</beans>

二、生产者xml中文件创建队列

在生产者项目里我们创建了xml的配置文件,在该文件里我们可以通过标签去创建队列

<rabbit:queue id="" name="" auto-declare="true" auto-delete="false" durable="true"></rabbit:queue>

id                      表示bean的名称

name                表示队列的名称

auto-declare     表示如果当服务器没有该队列时是否创建

durable             表示是否持久化到内存

三、生产者xml文件中创建交换机以及绑定队列

1、创建交换机

同样在生产者项目里我们之前创建的xml文件里同样我们也可以一个标签去创建交换机以及绑定队列

<rabbit:fanout-exchange id="" name="" auto-declare="true" auto-delete="false" durable="true">
    
</rabbit:fanout-exchange>

id                      表示bean的名称

name                表示交换机的名称

auto-declare     表示如果当服务器没有该交换机时是否创建

durable             表示是否持久化到内存

2、绑定队列 

我们在创建的交换机标签里可以嵌套标签进行绑定

<rabbit:fanout-exchange id="" name="" auto-declare="true" auto-delete="false" durable="true">
    <rabbit:bindings>
        <rabbit:binding queue="test"></rabbit:binding>
    </rabbit:bindings>
</rabbit:fanout-exchange>

queue    表示绑定的队列名成

此处由于创建的交换机类型是fanout广播类型不需要去配置路由,如果创建的direct交换机不止需要配置队列名属性,还需要配置路由属性,如果是topic交换机则需要配置通配符 

 <rabbit:queue id="test" name="test" auto-declare="true" auto-delete="false" durable="true"></rabbit:queue>


    <rabbit:fanout-exchange id="" name="" auto-declare="true" auto-delete="false" durable="true">
        <rabbit:bindings>
            <rabbit:binding queue="test"></rabbit:binding>
        </rabbit:bindings>
    </rabbit:fanout-exchange>

    <rabbit:direct-exchange id="" name="" durable="true" auto-delete="false" auto-declare="true">
        <rabbit:bindings>
            <rabbit:binding queue="test" key="路由"></rabbit:binding>
        </rabbit:bindings>
    </rabbit:direct-exchange>

    <rabbit:topic-exchange id="" name="" auto-declare="true" auto-delete="false" durable="true">
        <rabbit:bindings>
            <rabbit:binding queue="test" pattern="*.error"></rabbit:binding>
        </rabbit:bindings>
    </rabbit:topic-exchange>

四、消费者xml文件中创建队列消息监听器

同样在消费者创建的xml文件里我们路创建队列监听器容器来将不同队列的消息映射到不同的类

首先我们需要创建一个类实现MessageListener接口实现onMessage方法

 然后将他注入spring容器

 在xml里此时我们可以通过标签创建监听器

<rabbit:listener-container connection-factory="connectionFactory" auto-declare="true">
    <rabbit:listener ref="testQueueListener" queue-names="test"></rabbit:listener>
    <rabbit:listener ref="" queue-names=""></rabbit:listener>
    ………………
</rabbit:listener-container>

ref                     表示之前我们定义实现了MessageListener接口的监听类在spring容器里的id

queues-names  表示该类要监听的队列

后续需要再进行添加,在该标签下可继续进行添加 

在之前创建的类重写的方法里参数message.getBody()即可获得队列里消息

五、Spring实现RabbitMQ五大工作模式

五大工作模式在之前的文章提到,如果不了解可以查看【RabbitMQ】Rabbbit的六种工作模式以及代码实现_1373i的博客-CSDN博客https://blog.csdn.net/qq_61903414/article/details/130156097?spm=1001.2014.3001.5501

1、简单模式

1.生产者

我们先要在生产者xml配置文件里创建一个队列

然后在项目目录下创建一个测试类类加注解读取配置文件以及环境

在类里注入RabbitTemplate对象,通过该对象的convertAndSend方法发送消息,由于我们使用的是简单模式,所以此处路由为队列名

package com.itheima;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:producer.xml")
public class ProducerTest {

    // 1.注入 RabbitTemplate
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testHelloWorld(){
        // 2.发送消息
        rabbitTemplate.convertAndSend("test","hello mq");
    }
}

运行代码查看服务器 

2.消费者

首先我们需要创建一个监听类实现MessageListener接口并重写onMessage方法

然后将这个类注入spring里,在xml里创建监听器容器将这个类与队列绑定去监听队列

然后创建一个测试类,与生产者相同加两个 注解,然后在测试方法里死循环的去监听队列 

运行代码 

  

2、work queues工作队列模式

工作队列模式与上述相同,将生产者复制一份即可

1.生产者

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:producer.xml")
public class ProducerTest {

    // 1.注入 RabbitTemplate
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testHelloWorld(){
        // 2.发送消息
        rabbitTemplate.convertAndSend("test","hello mq");
    }
}

2.消费者

创建两个消费者类实现MessageListener接口重写onMessage方法然后将其注入Spring容器,在监听容器将队列与spring bean绑定即可

package com.example.rabbitmq.listener;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;

public class SpringQueueListener1 implements MessageListener {
    @Override
    public void onMessage(Message message) {
        //打印消息
        System.out.println("收到消息:" + new String(message.getBody()));
    }
}
package com.example.rabbitmq.listener;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;

public class SpringQueueListener2 implements MessageListener {
    @Override
    public void onMessage(Message message) {
        //打印消息
        System.out.println("收到消息:" + new String(message.getBody()));
    }
}
<bean id="springQueueListener1" class="com.example.rabbitmq.listener.SpringQueueListener1"/>
    <bean id="springQueueListener2" class="com.example.rabbitmq.listener.SpringQueueListener2"/>


    <rabbit:listener-container connection-factory="connectionFactory" auto-declare="true">
        <rabbit:listener ref="springQueueListener1" queue-names="test"></rabbit:listener>
        <rabbit:listener ref="springQueueListener2" queue-names="test"></rabbit:listener>
    </rabbit:listener-container>

3、pub/sub订阅模式

订阅模式与前两种不同,订阅模式需要使用到fanout类型的交换机,并且将队列与之绑定,他的生产者在xml文件里需要去创建两个队列与fanout类型的交换机并绑定,在发送消息时指定交换机名称即可,而消费者则与前者相同,只是需要修改指定监听的队列名

1.生产者

xml文件创建队列与交换机

 <rabbit:queue id="fQueue1" name="fQueue1" auto-declare="true" auto-delete="false" durable="true"></rabbit:queue>
    <rabbit:queue id="fQueue2" name="fQueue2" auto-declare="true" auto-delete="false" durable="true"></rabbit:queue>

    <rabbit:fanout-exchange id="fExchange" name="fExchange" auto-declare="true">
        <rabbit:bindings>
            <rabbit:binding queue="fQueue1"></rabbit:binding>
            <rabbit:binding queue="fQueue2"></rabbit:binding>
        </rabbit:bindings>
    </rabbit:fanout-exchange>

此时我们只需要在发送消息时指定交换机即可 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:producer.xml")
public class ProducerTest {

    // 1.注入 RabbitTemplate
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testHelloWorld(){
        // 2.发送消息
        rabbitTemplate.convertAndSend("test","hello mq");
    }

    @Test
    public void testFanout(){
        rabbitTemplate.convertAndSend("fExchange","","hello fanout");
    }
}

 运行代码

2.消费者

消费者与前面消费者创建相同,只需修改对应的监听队列名即可

4、routing路由模式

路由模式与订阅模式相同都需要创建交换机,路由模式需要创建direct类型交换机,且在绑定队列时需要指定该队列的路由key

1.生产者

xml文件--创建交换机

 <rabbit:queue id="dQueue1" name="dQueue1" auto-declare="true"></rabbit:queue>
    <rabbit:queue id="dQueue2" name="dQueue2" auto-declare="true"></rabbit:queue>

    <rabbit:direct-exchange name="dExchange" id="dExchange" auto-declare="true">
        <rabbit:bindings>
            <rabbit:binding queue="dQueue1" key="q1"></rabbit:binding>
            <rabbit:binding queue="dQueue2" key="q2"></rabbit:binding>
        </rabbit:bindings>
    </rabbit:direct-exchange>

发送消息时需要指定交换机以及路由

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:producer.xml")
public class ProducerTest {

    // 1.注入 RabbitTemplate
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testHelloWorld(){
        // 2.发送消息
        rabbitTemplate.convertAndSend("test","hello mq");
    }

    @Test
    public void testFanout(){
        rabbitTemplate.convertAndSend("fExchange","","hello fanout");
    }

@Test
    public void testDirect(){
        //2.发送消息

        rabbitTemplate.convertAndSend("dExchange","q1","hello direct");
    }
}

 运行代码查看控制台

 2.消费者

消费者代码与前面相同,只需修改监听队列名即可

5、topics通配符模式

整体代码与路由模式类似,他需要创建topic类型交换机且配置通配符规则

1.生产者

xml文件创建交换机与队列

<rabbit:queue id="tQueue1" name="tQueue1" auto-declare="true"></rabbit:queue>
    <rabbit:queue id="tQueue2" name="tQueue2" auto-declare="true"></rabbit:queue>
    
    <rabbit:topic-exchange name="tExchange" id="tExchange" auto-declare="true">
        <rabbit:bindings>
            <rabbit:binding pattern="A.*" queue="tQueue1"></rabbit:binding>
            <rabbit:binding pattern="#.info" queue="tQueue2"></rabbit:binding>
        </rabbit:bindings>
    </rabbit:topic-exchange>

发送消息时需要填写匹配路由

@Test
    public void testTopic() {
        rabbitTemplate.convertAndSend("tExchange","A.ERROR","A系统的error错误");
    }

 运行代码查看控制台

2.消费者

消费者代码与前面相同,依旧只需要修改监听队列名即可

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

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

相关文章

第五十八章 线段树(一)

第五十八章 线段树&#xff08;一&#xff09;一、树状数组的缺陷二、线段树的作用三、线段树的基本构成1、节点定义2、线段树的结构四、线段树的重要函数1、构造线段树——bulid函数2、查询区间——query函数3、单点修改——modify函数五、例题一、树状数组的缺陷 在前面两个…

flink 的 State

目录 一、前言 二、什么是State 2.1&#xff1a;什么时候需要历史数据 2.2&#xff1a;为什么要容错&#xff0c;以及checkpoint如何进行容错 2.3&#xff1a;state basckend 又是什么 三、有哪些常见的是 State 四、 State的使用 五、State backend 5.1 MemoryState…

进程,线程,调度和调度算法基本知识

进程 我们编写的代码只是一个存储在硬盘的静态文件&#xff0c;通过编译后就会生成二进制可执行文件&#xff0c;当我们运行这个可执行文件后&#xff0c;它会被装载到内存中&#xff0c;接着 CPU 会执行程序中的每一条指令&#xff0c;那么这个运行中的程序&#xff0c;就被称…

【C++】内联函数理解

内联函数 内联函数的使用是对于C语言中宏函数的一种改进&#xff0c;他继承了宏的优点并避免了宏的缺点。 宏的优点&#xff1a;a. 代码复用性高 b. 宏函数减少栈帧建立&#xff0c;提高效率 宏的缺点&#xff1a;a. 可读性差 b. 没有类型安全检查 c. 不方便调试 C基本不再建议…

银行数字化转型导师坚鹏:金融数据治理、数据安全政策解读

金融数据治理、数据安全政策解读及大数据应用课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不知道如何准确理解金融数据治理及数据安全相关政策 不清楚金融数据治理及数据安全相关政策对银行有什么影响&#xff1f; 不清楚如何有效应用金融数据治理及数据安全相关…

软考软件设计师 下午试题二笔记

E-R图基本图形元素 实体 一个实体的存在要以另一个实体存在为前提&#xff0c;这个就是弱实体&#xff0c;比如家属和职工&#xff0c;家属的存在就是依赖于职工 属性 属性带下划线的是主键 联系 三个实体之间的联系 试题二问题一例题 问题二 将er图转成关系模式就是问题二答…

Cell Discovery:人类特异基因促进大脑皮层折叠新机制

在人类进化过程中&#xff0c;新皮层的扩张与智力的提高和认知功能的改善密切相关。这种扩张的一个关键方面是大脑皮层沟回的形成&#xff0c;它使扩张的皮质表面积能够适应有限的颅骨空间。这些进化特征主要依赖于多种神经干细胞和祖细胞亚型及其神经源性分裂产生的更多数量的…

《计算机网络-自顶向下》05. 网络层-控制平面

文章目录路由控制方式每路由控制逻辑集中式控制路由选择算法LS —— 链路状态路由选择算法DV —— 距离向量路由选择算法LS 和 DV 算法的比较自治系统内部路由协议RIPOSPF自治系统外部路由协议&#xff1a;BGP通告 BGP 路由信息选择最好的路由相关术语热土豆选择路由选择算法&a…

Swagger教程

Swagger 目标 Swagger简介【了解】 Springboot整合swagger【掌握】 Swagger 常用注解【掌握】 一、Swagger简介 ​ Swagger 是一系列 RESTful API 的工具&#xff0c;通过 Swagger 可以获得项目的⼀种交互式文档&#xff0c;客户端 SDK 的自 动生成等功能。 ​ Swagger …

TryHackMe-Year of the Owl(Windows渗透测试)

Year of the Owl 当迷宫在你面前&#xff0c;你迷失了方向时&#xff0c;有时跳墙思考是前进的方向。 端口扫描 循例 nmap SMB枚举 smbmap enum4linux也什么都没有 Web枚举 80端口 gobuster扫到一堆403&#xff0c;并没有什么有用的信息 443端口与80端口一致 47001端口依…

【SQL】公网远程访问局域网SQL Server数据库【无公网IP内网穿透】

目录 1.前言 2.本地安装和设置SQL Server 2.1 SQL Server下载 2.2 SQL Server本地连接测试 2.3 Cpolar内网穿透的下载和安装 2.3 Cpolar内网穿透的注册 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 转发自CSDN远程穿透的文章&#xff1a;[无需公网IP&am…

详解以太坊

以太坊原理 以太坊通过建立终极的抽象的基础层-内置有图灵完备编程语言的区块链-使得任何人都能够创建合约和去中心化应用&#xff0c;并在其中设立他们自由定义的所有权规则、交易方式和状态转换函数。 图灵完备&#xff1a;能够运行非常复杂的运算&#xff0c;最简单的理解…

基于共享储能电站的工业用户日前优化经济调度

目录 1 主要内容 共享电站示意图 目标函数 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序方法复现《基于共享储能电站的工业用户日前优化经济调度》算例2和算例3&#xff0c;根据共享储能电站的商业运营模式&#xff0c;将共享储能电站应用到工业用户经济优化调度…

〖Python网络爬虫实战⑨〗- 正则表达式基本原理

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

【Linux】用户命令(创建,修改,切换,删除,密码)

目录 1.创建 查看用户信息 查看id 2.修改 修改用户名 修改用户uid 操作前&#xff1a; 操作后 修改组名 操作前&#xff1a; 操作后: 修改组id 操作前&#xff1a; 操作后&#xff1a; 操作前&#xff1a; 操作后: 3.切换用户 4.删除 操作前&#xff1a; 操作…

如何在Spring Boot中使用Spring MVC

目录 1.MVC 2.Spring MVC 3.Spring Boot中使用Spring MVC 3.1.配置 3.1.1.文件配置 3.1.2.代码配置 3.2.使用 3.2.1.映射处理器 3.2.2.传参 3.2.3.参数转换 3.2.4.数据校验 3.2.5.数据模型 3.2.6.视图和解析器 3.2.7.拦截器 1.MVC MVC 是一种常见的软件设计模式…

企业级信息系统开发讲课笔记2.4 利用MyBatis实现条件查询

文章目录零、本节学习目标一、查询需求二、打开MyBatisDemo项目三、对学生表实现条件查询&#xff08;一&#xff09;创建学生映射器配置文件&#xff08;二&#xff09;在MyBatis配置文件里注册学生映射器配置文件&#xff08;三&#xff09;创建学生映射器接口&#xff08;四…

macOS Ventura 13.3.1 (22E261) Boot ISO 原版可引导镜像

本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 macOS Ventura 13.3.1 为 Mac 提供下…

os库的使用与第三方库安装脚本

os库基本介绍 os 顾名思义&#xff0c;就是与操作系统相关的标准库。如&#xff1a;文件&#xff0c;目录&#xff0c;执行系统命令等。 os库是Python标准库&#xff0c;包含几百个函数 常用路径操作、进程管理、环境参数等几类 路径操作&#xff1a;os.path子库&#xff0…

安捷伦34970A

18320918653 34970A Agilent 34970A 数据采集器|安捷伦数据采集器|34970A 您可信任的测量&#xff1a; 我们把销售良好数字多用表测量引擎嵌入在3槽主机箱中。您能获得优异的测量能力&#xff0c;带有内置信号调整的通用输入&#xff0c;模块化的灵活性&#xff0c;低廉的售…