Springboot整合RabbitMQ消息中间件的使用

 更新时间:2023年11月13日 09:30:57   作者:雾林小妖  
在没有特别要求的情况下,通常会选择RabbitMQ作为消息中间件,本文主要介绍了Springboot整合RabbitMQ消息中间件的使用,具有一定的参考价值,感兴趣的可以了解一下

1、RabbitMQ概述

RabbitMQ是shiyongERLANG语言编写的,实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。

常见的消息中间件:KAFKA、RabbitMQ、ActiveMQ、RocketMQ(可以处理分布式事务)

1.1、什么是RabbitMQ?

【1、通过案例理解RabbitMQ】

你想和远方的好友实现通信,这个时候你给好友写封信,我们将写好的信封装成一个信封,将信放到邮箱中,邮差就会在规定的时间将这封信送到远方好友的手中。

寄件人是A系统,远方好友是B系统,RabbitMQ就是邮箱,邮差就是信道。A系统和B系统可以通过RabbitMQ实现通信。

【2、为什么要使用RabbitMQ? 】

1、RabbitMQ实现了AMQP标准的消息服务器

2、可靠性,RabbitMQ的持久化支持,保证了消息的稳定性;

3、RabbitMQ使用了Erlang开发语言,高并发、高可用、集群部署简单等特性;

【3、RabbitMQ能做什么?】

1、业务解耦:下订单、扣减库存、生成订单、发红包、发短信、异步操作、日志处理、跨平台通信等。

2、流量消峰:控制请求量。

3、路由灵活:RabbitMQ有丰富的Exchange(交换器),通过关键字Routingkey判断消息的具体队列(Queue)。

1.2、RabbitMQ消息发送原理

1、生产者生产消息,发送给服务器端的Exchange交换器。

2、Exchange收到消息,根据用户发送的RoutingKey,将消息转发给匹配的Queue1或Queue2。

3、Queue1或Queue2收到消息后,将消息发送给订阅者(消费者1或消费者2)。

4、消费者收到消息,发送ACK给队列确认收到消息。

5、消费者收到ACK确认消息,然后删除队列中缓存的对应消息。

1.3、RabbitMQ在项目中的应用

A系统和B系统之间如果不是使用同一架构或者语言编写的,这个时候可以通过RabbitMQ进行通信。

如A系统可以发送JSON类型的数据,B系统获取数据的时候可以解析JSON,达到跨系统交互。

2、Springboot整合RabbitMQ

2.1、配置工程包信息

核心包:spring-cloud-starter-bus-amqp

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.17</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.txc</groupId>
    <artifactId>springbootrabbitmqdemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springbootrabbitmqdemo</name>
    <description>springbootrabbitmqdemo</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <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.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2.2、在application.yml文件中配置连接信息

spring:
  rabbitmq:
    addresses: localhost #IP地址
    username: guest   #用户名
    password: guest   #密码
    dynamic: true     #默认创建一个AmqpAdmin的Bean 默认:true

2.3、在工程中创建RabbitMQ消息接收程序

@RabbitListener(queuesToDeclare = @Queue("myQueue "))作用:

1、让监听关联到myQueue队列中

2、queuesToDeclare能够实现当myQueue队列不存在的时候,自动创建

3、queuesToDeclare:后面的参数需要的是数组类型使用@Queue创建

@Configuration
public class RabbitMQReceive {
    @RabbitListener(queuesToDeclare = @Queue("myQueue"))
    public void process(String message){
        System.out.println("======消费消息====="+message);
    }
}

2.4、在工程中创建RabbitMQ消息发送程序

创建控制层,模拟向RabbitMQ消息中间件发送消息。

通过convertAndSend向RabbitMQ发送消息。

@Controller
public class TestRabbitMQController {
    @Resource
    private AmqpTemplate amqpTemplate;

    @RequestMapping("/sendMessageToQueue")
    @ResponseBody
    public void  sendMessageToQueue(){
        amqpTemplate.convertAndSend("myQueue","{'code':'200','msg':'你想发的消息。'}");
    }
}

2.5、测试结果

 访问地址:http://localhost:8080/sendMessageToQueue

3、创建Exchange(交换器)绑定Queue

3.1、Exchange交换器的使用场景

我们要实现如果是华为的订单就发送到huaweiQueue队列中,如果是联想的订单就发送到lenovoQueue队列中。

主要就是通过RoutingKey(huaweiKey、lenovoKey)来实现。

3.2、在工程中创建RabbitMQ接收器

通过@RabbitListener实现创建huaweiQueue队列和computerExchange交换器,并通过huaweiKey实现队列和交换器绑定。

在不指定交换器类型的情况下,默认的交换器类型是direct

@RabbitListener(bindings = @QueueBinding(
        exchange = @Exchange("computerExchange"),
        key = "huaweiKey",
        value = @Queue("huaweiQueue")
))
public void process1(String message){
    System.out.println("======消费消息====="+message);
}

3.3、在工程中创建RabbitmQ消息发送程序

convertAndSend参数说明:convertAndSend(“交换器名称”,”绑定key”,”需要发送的消息”);

@RequestMapping("/sendMessageToExchange")
@ResponseBody
public void  sendMessageToExchange(){
    amqpTemplate.convertAndSend("computerExchange","huaweiKey","{'code':'200','msg':'测试Exchange和Queue绑定'}");
}

3.4、测试结果

访问地址:http://localhost:8080/sendMessageToExchange

到此这篇关于Springboot整合RabbitMQ消息中间件的使用的文章就介绍到这了,更多相关Springboot RabbitMQ消息中间件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java爬虫Jsoup+httpclient获取动态生成的数据

    Java爬虫Jsoup+httpclient获取动态生成的数据

    这篇文章主要介绍了Java爬虫Jsoup+httpclient获取动态生成的数据的相关资料,需要的朋友可以参考下
    2017-05-05
  • 一文了解jJava中的加密与安全

    一文了解jJava中的加密与安全

    常见的编码有ASCII码、Unicode编码。最简单的编码是直接给每个字符指定一个若干字节表示的整数,复杂一点的编码就需要根据已有的编码推算出来。本文将为大家详细讲讲Java重点加密与安全,感兴趣的可以了解一下
    2022-07-07
  • Mysql存储java对象实例详解

    Mysql存储java对象实例详解

    这篇文章主要介绍了Mysql存储java对象实例详解的相关资料,需要的朋友可以参考下
    2016-11-11
  • idea中的lombok不生效的四种解决方法

    idea中的lombok不生效的四种解决方法

    Lombok项目是一个java库,它可以自动插入到编辑器和构建工具中,本文将详细给大家介绍idea中的lombok不生效的四种解决方法,需要的朋友可以参考下
    2023-05-05
  • 详解Java中使用泛型实现快速排序算法的方法

    详解Java中使用泛型实现快速排序算法的方法

    这篇文章主要介绍了Java中使用泛型实现快速排序算法的方法,快速排序的平均时间复杂度为(n\log n),文中的方法立足于基础而并没有考虑优化处理,需要的朋友可以参考下
    2016-05-05
  • MyBatis Generator去掉生成的注解

    MyBatis Generator去掉生成的注解

    这篇文章主要介绍了MyBatis Generator去掉生成的注解的相关资料,非常不错具有一定的参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • 阿里的Easyexcel读取Excel文件的方法(最新版本)

    阿里的Easyexcel读取Excel文件的方法(最新版本)

    这篇文章主要介绍了阿里的Easyexcel读取Excel文件(最新版本)的方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • SpringBoot的application.yml不生效问题及解决

    SpringBoot的application.yml不生效问题及解决

    这篇文章主要介绍了SpringBoot的application.yml不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • java实现简单的学生信息管理系统代码实例

    java实现简单的学生信息管理系统代码实例

    这篇文章主要介绍了java实现简单的学生信息管理系统,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java中的自旋锁与适应性自旋锁详解

    Java中的自旋锁与适应性自旋锁详解

    这篇文章主要介绍了Java中的自旋锁与适应性自旋锁详解,在多处理器环境中某些资源的有限性,有时需要互斥访问,这时候就需要引入锁的概念,只有获取了锁的线程才能对资源进行访问,多线程的核心是CPU的时间分片,所以同一时刻只能有一个线程获取到锁,需要的朋友可以参考下
    2023-10-10

最新评论