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

这篇具有很好参考价值的文章主要介绍了【RabbitMQ】Spring整合RabbitMQ、Spring实现RabbitMQ五大工作模式(万字长文)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、准备

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项目

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

2、引入依赖

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

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

<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

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

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

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

2.生产者项目配置文件

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

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

在该文件添加下面代码

<?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的配置文件,在该文件里我们可以通过标签去创建队列spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

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

id                      表示bean的名称

name                表示队列的名称

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

durable             表示是否持久化到内存

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

1、创建交换机

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

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

id                      表示bean的名称

name                表示交换机的名称

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

durable             表示是否持久化到内存

2、绑定队列 

我们在创建的交换机标签里可以嵌套标签进行绑定spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

<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交换机则需要配置通配符 

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

 <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 rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

 然后将他注入spring容器spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,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  表示该类要监听的队列

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

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

在之前创建的类重写的方法里参数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配置文件里创建一个队列

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

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

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

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

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

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");
    }
}

运行代码查看服务器spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring 

2.消费者

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

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

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

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

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

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

运行代码 spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring  

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>

此时我们只需要在发送消息时指定交换机即可spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring 

@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");
    }
}

 运行代码spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

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>

发送消息时需要指定交换机以及路由spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

@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");
    }
}

 运行代码查看控制台spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

 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错误");
    }

 运行代码查看控制台spring rabbitmq,RabbitMQ,Java,java-rabbitmq,rabbitmq,spring

2.消费者

消费者代码与前面相同,依旧只需要修改监听队列名即可文章来源地址https://www.toymoban.com/news/detail-810004.html

到了这里,关于【RabbitMQ】Spring整合RabbitMQ、Spring实现RabbitMQ五大工作模式(万字长文)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 全网最全RabbitMQ笔记 | 万字长文爆肝RabbitMQ基础

    万字长文爆肝黑马程序员2023最新版RabbitMQ教程。笔者认真跟着这个教程,再一次认真学习一遍RabbitMQ教程,温故而知新,对RabbitMQ消息队列也有了更加深入细致的了解。因此笔者做了全网最全面详细的学习笔记,通篇图文并茂,细致入微,由浅入深,循序渐进,深入剖析原理,

    2024年04月14日
    浏览(35)
  • ChatGPT的工作原理(纯干货,万字长文)

    ChatGPT 能够自动生成一些读起来表面上甚至像人写的文字的东西,这非常了不起,而且出乎意料。但它是如何做到的?为什么它能发挥作用?我在这里的目的是大致介绍一下 ChatGPT 内部的情况,然后探讨一下为什么它能很好地生成我们认为是有意义的文本。 我首先要说明一下

    2024年02月03日
    浏览(51)
  • RabbitMQ(一) - 基本结构、SpringBoot整合RabbitMQ、工作队列、发布订阅、直接、主题交换机模式

    Publisher : 生产者 Queue: 存储消息的容器队列; Consumer:消费者 Connection:消费者与消息服务的TCP连接 Channel:信道,是TCP里面的虚拟连接。例如:电缆相当于TCP,信道是一条独立光纤束,一条TCP连接上创建多少条信道是没有限制的。TCP一旦打开,就会出AMQP信道。无论是发布消息

    2024年02月14日
    浏览(55)
  • 万字长文带你吃透SpringCloudGateway工作原理+动态路由+源码解析

    Spring Cloud 2.x 实 现 了 社 区 生 态 下 的 Spring CloudGateway(简称SCG)微服务网关项目。Spring Cloud Gateway基于WebFlux框架开发,目标是替换掉Zuul。 Spring Cloud Gateway主要有两个特性: 非阻塞,默认使用RxNetty作为响应式Web容器,通过非阻塞方式,利用较少的线程和资源来处理高并发请

    2023年04月08日
    浏览(49)
  • 【万字长文】SpringBoot整合SpringSecurity+JWT+Redis完整教程(提供Gitee源码)

    前言:最近在学习SpringSecurity的过程中,参考了很多网上的教程,同时也参考了一些目前主流的开源框架,于是结合自己的思路写了一个SpringBoot整合SpringSecurity+JWT+Redis完整的项目,从0到1写完感觉还是收获到不少的,于是我把我完整的笔记写成博客分享给大家,算是比较全的

    2024年02月15日
    浏览(39)
  • Spring整合RabbitMQ-配制文件方式-3-消息拉模式

    拉消息的消费者 spring-rabbit.xml 当启动消费者后,便可获取到发送至队列的消息 检查队列的消息的情况: 经过检查确认,发现消息已经被消费了。 至此拉模式的消费者完成。

    2024年02月09日
    浏览(40)
  • Spring Boot整合RabbitMQ之发布与订阅模式

    RabbitMQ的模式中,常用的模式有:简单模式,发布与订阅模式,工作模式,路由模式,主题模式。简单模式不太会运用到工作中,我们可以使用 RabbitMQ 的发布订阅模式,实现: 用户发布动态,其“粉丝”收到其发布动态的消息 用户下订单,库存模块、支付模块等收到消息并

    2024年02月12日
    浏览(41)
  • Spring Boot整合RabbitMQ之路由模式(Direct)

    RabbitMQ中的路由模式(Direct模式)应该是在实际工作中运用的比较多的一种模式了,这个模式和发布与订阅模式的区别在于路由模式需要有一个routingKey,在配置上,交换机类型需要注入DirectExchange类型的交换机bean对象。在交换机和队列的绑定过程中,绑定关系需要在绑定一个

    2024年02月11日
    浏览(44)
  • 【万字长文】SpringBoot整合MyBatis搭建MySQL多数据源完整教程(提供Gitee源码)

    前言:在我往期的博客介绍了2种关于如何使用SpringBoot搭建多数据源操作,本期博客我参考的是目前主流的框架,把最后一种整合多数据源的方式以博客的形式讲解完,整合的过程比较传统和复杂,不过我依旧会把每个实体类的思路都给大家讲解清楚的,项目的最后我都会提

    2024年02月14日
    浏览(44)
  • Spring整合RabbitMQ-配制文件方式-2-推模式消费者

    推模式的消费者 在推模式中使用可以两种实现: 使用ChannelAwareMessageListener. 除消息外,还提供了Channel这个对象,通过channel可以有更大的灵活性。 使用MessageListener 基本的消息的临时。普通的场景基本够用。 此处以ChannelAwareMessageListener为样例: spring-rabbit.xml 容器启动类 首先

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包