[Spring boot] Spring boot 整合RabbitMQ实现通过RabbitMQ进行项目的连接

这篇具有很好参考价值的文章主要介绍了[Spring boot] Spring boot 整合RabbitMQ实现通过RabbitMQ进行项目的连接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 🍳作者:天海奈奈

💭眼过千遍不如手锤一遍:推荐一款模拟面试,斩获大厂 o f f e r ,程序员的必备刷题平台 − − 牛客网 

👉🏻点击开始刷题之旅

目录

什么是RabbitMQ

  消息队列:接受并转发消息,类似于快递公司

消息队列的优点

消息队列的特性

RabbitMQ特点

RabbitMQ核心概念

Producer :消息生产者

Message :消息

Exchange :交换机

Binding :绑定交换机和队列

Routing key :路由键,决定路由规则

Queue :队列,存储消息

Connection :连接服务端

Channel :信道,读写数据.

Consumer :消费者

Broker :服务实例

Virtual host :虚拟主机,用于区分不同服务,类似于不同域名,不会相互影响

安装RabbitMQ

LINUX环境下安装3.8.2 使用Xshell

 常用命令

Windows

RabbitMQ实操分布了解

1 生产者

2 消费者

Springboot 整合RabbitMQ代码实操

生产者

消费者

运行结果


 文章来源地址https://www.toymoban.com/news/detail-820371.html

什么是RabbitMQ

 

官网 Messaging that just works — RabbitMQ

springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

 springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

  消息队列:接受并转发消息,类似于快递公司

product : 消息的发送者,生产者

consumer:消息的消费者,从队列获取消息,并且使用

queue :先进先出,一个queue可以对应多个consumer

消息队列的优点

代码解耦,提高系统稳定性

应对流量高峰,降低流量冲击,面对秒杀这种情况时,请求进来先去排队,可以保证系统的稳定

异步执行,提高系统响应速度

消息队列的特性

性能好

它是一种基础组件

支持消息确认,为了防止数据丢失以及应对特殊情况,在数据没有处理完,没有确认之前消息不会丢掉。

RabbitMQ特点

路由能力灵活强大

开源免费

支持编程语言多

应用广泛,社区活跃

有开箱即用的监控和管理后台

RabbitMQ核心概念

springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

 生产者数量是不限制的,生产者生产的消息Message进入交换机,交换一可以连接多个队列也可以仅连接一个对联,交换机与队列的关系是不固定的,交换机会绑定到队列上(Binding)根据的规则就是Routing Key路由键用来确定交换机与队列如何进行绑定 ,消息经过交换机经过连接发送个消费者,在连接中多多个信道,数据都是在信道中进行读写的,消费者从中提取想要的消息进行处理。Broker(服务实例)也就是服务端,Virtual Host (虚拟主机)同一个RabbitMQ可能给多个服务进行使用,服务与服务之间想要隔离开就可以使用虚拟主机进行隔离。

Producer :消息生产者

Message :消息

Exchange :交换机

Binding :绑定交换机和队列

Routing key :路由键,决定路由规则

Queue :队列,存储消息

Connection :连接服务端

Channel :信道,读写数据.

Consumer :消费者

Broker :服务实例

Virtual host :虚拟主机,用于区分不同服务,类似于不同域名,不会相互影响

安装RabbitMQ

LINUX环境下安装3.8.2 使用Xshell

先进行环境配置

连接成功以后输入

echo "export LC_ALL=en_US.UTF-8"  >> /etc/profile   把编码设置成utf-8

source /etc/profile  使设置生效

输入curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash 配置RabbitMQ源 

springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

看到这个命令就可以进行下一步了

curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash

配置erlang环境springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

 看到这个命令进行下一步

sudo yum install rabbitmq-server-3.8.2-1.el7.noarch

springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

 输入y

springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

 常用命令

开启web管理界面

rabbitmq-plugins enable rabbitmq_management

停止RabbitMQ

rabbitmqctl stop

设置开机启动

 systemctl enable rabbitmq-server

启动RabbitMQ

 systemctl start rabbitmq-server

看看端口有没有起来,查看状态

rabbitmqctl status

要检查RabbitMQ服务器的状态,请运行:

systemctl status rabbitmq-server

Windows

先安装erlang并配置环境,安装RabbitMQ

链接:https://pan.baidu.com/s/1S4D2zh-NSoXh-QPQVNBi-w 
提取码:1111 
这里直接放上链接,erlang安装好后要去配置环境 
springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java解压缩后sbin目录下,rabbitmq-server.bat 这个文件就是启动

用终端cmd输入:

cd d:\你的RabbitMQ按照地址\sbin

rabbitmq-plugins enable rabbitmq_management

rabbitmq-server

然后就可以用guest访问http://127.0.0.1:15672/#/

账号密码都是guest 

springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

RabbitMQ实操分布了解

1 生产者

这里的前提是你有个云服务器,并且已经完成了配置,为了操作简便这里就用本机了哈

 

我们要有一个管理者啊在sbin目录输入

rabbitmqctl add_user newadmin newpassword

rabbitmqctl set_user_tags newadmin administrator

rabbitmqctl set_permissions -p / newadmin ".*" ".*" ".*"//这一步已经把在虚拟主机上把权限配置了
 

账号test 密码123456

新建一个mavene项目,

springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

 2 引入依赖

<dependencies>
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.8.0</version>
        </dependency>
<!--        记录日志-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.29</version>
        </dependency>
    </dependencies>
/**
 * 描述 发送类 连接到服务端 发送 退出
 */
public class Send {
    //设置队列的名字
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置RabbitMQ地址
        factory.setHost("127.0.0.1");
        factory.setUsername("test");
        factory.setPassword("123456");
        //建立连接
        Connection connection = factory.newConnection();
        //获得信道
        Channel channel = connection.createChannel();
        //声明队列
        //                   queueName    持久存在?  独有?       自动删除?
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        //发布消息
        String message = "Hello World! ";
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
        System.out.println("发送了消息:" + message);
        //关闭连接
        channel.close();
        connection.close();
    }
}

运行一下

springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

 

发送成功了  如果我么连接不到RabbitMQ是无法正常发送的

2 消费者

我么要做的就是把刚刚发送的存储在队列里的消息拿到并打印出来

**
 * 描述:     接收消息,并打印,持续运行
 */
public class Recvice {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置RabbitMQ地址
        factory.setHost("127.0.0.1");
        factory.setUsername("test");
        factory.setPassword("123456");
        //建立连接
        Connection connection = factory.newConnection();
        //获得信道
        Channel channel = connection.createChannel();
        //声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        //接收消息并消费       queueName    自动签收   处理消息
        channel.basicConsume(QUEUE_NAME, true, new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                    BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println("收到消息:" + message);
            }
        });
    }
}

springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

可以看到Receive是(打错了,尬)一直运行的,我么把发送的消息改一下再发送试试

 springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

 springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

我们之前设置的是自动接收消息们可以看到运行时成功的

 springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

去web控制台也能看到是有hello这个队列的  还有更多的功能就靠你们自己去探索了

 

Springboot 整合RabbitMQ代码实操

1 新建两个Spring项目 一个生产者,一个消费者不需要引入依赖一会儿手动加

springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

 springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

主要关键是定义队列 queue 定义routingKey

生产者

配置文件

guest是默认的用户只能本机时使用

server.port=8080
spring.application.name=producer

spring.rabbitmq.addresses=127.0.0.1:5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000

依赖

<?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.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>spring-boot-rabbirmq-producer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-rabbirmq-producer</name>
    <description>spring-boot-rabbirmq-producer</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

我们只在原基础上加了一个依赖

spring-boot-starter-amqp

启动类

@SpringBootApplication
public class SpringBootRabbirmqProducerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootRabbirmqProducerApplication.class, args);
    }

}

发送消息类

/**
 * 描述:     发送消息
 */
@Component
public class MessageSender {

    @Autowired
    private AmqpTemplate rabbitmqTemplate;

    public void send1() {
        String message = "This is message 1, routing key is hello.sayHello";
        System.out.println("发送了:"+message);
        //                                      交换机         key             内容
        this.rabbitmqTemplate.convertAndSend("bootExchange", "hello.sayHello", message);
    }

    public void send2() {
        String message = "This is message 2, routing key is hello.sayNothing";
        System.out.println("发送了:"+message);
        this.rabbitmqTemplate.convertAndSend("bootExchange", "hello.sayNothing", message);
    }
}

配置类

/**
 * 描述:     rabbitmq配置类
 */
@Configuration
public class TopicRabbitConfig {
    //定义队列 注意类型:import org.springframework.amqp.core.Queue;
    @Bean
    public Queue queue1() {
        return new Queue("queue1");
    }

    @Bean
    public Queue queue2() {
        return new Queue("queue2");
    }
    //交换机
    @Bean
    TopicExchange exchange() {
        return new TopicExchange("bootExchange");
    }
    //将队列绑定到交换机
    @Bean
    Binding bingdingExchangeMessage1(Queue queue1, TopicExchange exchange) {
        return BindingBuilder.bind(queue1).to(exchange).with("hello.sayHello");
    }

    @Bean
    Binding bingdingExchangeMessage2(Queue queue2, TopicExchange exchange) {
        return BindingBuilder.bind(queue2).to(exchange).with("hello.#");
    }
}

这里注意第一个消息的routingkey是跟配置类一样的hello.sayHello 就代表 我们这个交换机是仅能识别hello.sayHello的

第二个交换机的routingkey是hello.# 那就意味着只要key是hello.()类型我们都能识别到也就是第一个和第二个消息都能识别到

编写测试类用来发送消息

@SpringBootTest
class SpringBootRabbirmqProducerApplicationTests {
    @Autowired
    MessageSender messageSender;
    @Test
    public void send1(){
        messageSender.send1();
    }
    @Test
    public void send2(){
        messageSender.send2();
    }


}

生产者就编写完成

消费者

配置文件,大体一样,用户我用的管理者权限的用户test 端口号不能一样

server.port=8081
spring.application.name=consumer

spring.rabbitmq.addresses=127.0.0.1:5672
spring.rabbitmq.username=test
spring.rabbitmq.password=123456
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000

依赖 与生产者一样只用加一个

<?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.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>spring-boot-rabbitmq-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-rabbitmq-consumer</name>
    <description>spring-boot-rabbitmq-consumer</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

启动类

@SpringBootApplication
public class SpringBootRabbitmqConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootRabbitmqConsumerApplication.class, args);
    }

}

消费者1 消费者一绑的队列是queue1   接收消息是要通过交换机-> 队列-> 信道 那就意味着队列1中将有hello.sayHello 

/**
 * 描述:     消费者1
 */
@Component
@RabbitListener(queues = "queue1")
public class Receiver1 {
    //处理方法
    @RabbitHandler
    public void process(String message) {
        System.out.println("Receiver1: " + message);
    }
}

消费者2

/**
 * 描述:     消费者2
 */
@Component
@RabbitListener(queues = "queue2")
public class Receiver2 {

    @RabbitHandler
    public void process(String message) {
        System.out.println("Receiver2: " + message);
    }
}

运行结果

springboot rabbitmq 编程式链接,java-rabbitmq,rabbitmq,spring boot,java

 这本身是两个独立的项目,但是通过RabbitMQ使两个项目产生了连接,Springboot完成了对RabbitMQ的整合。

 

 

 

 

到了这里,关于[Spring boot] Spring boot 整合RabbitMQ实现通过RabbitMQ进行项目的连接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Spring Boot整合RabbitMQ之发布与订阅模式

    Spring Boot整合RabbitMQ之发布与订阅模式

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

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

    Spring Boot整合RabbitMQ之路由模式(Direct)

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

    2024年02月11日
    浏览(10)
  • RabbitMQ和spring boot整合及其他内容

    在现代分布式应用程序的设计中,消息队列系统是不可或缺的一部分,它为我们提供了解耦组件、实现异步通信和确保高性能的手段。RabbitMQ,作为一款强大的消息代理,能够协助我们实现这些目标。在本篇CSDN博客中,我们将探讨一些高级主题,包括RabbitMQ与Spring Boot的整合、

    2024年02月07日
    浏览(10)
  • Java(一):创建 Spring Boot 项目并实现连接操作MySQL数据库

    Java(一):创建 Spring Boot 项目并实现连接操作MySQL数据库

    MySQL 命令 Maven 相关地址 下载地址: https://maven.apache.org/ maven配置方法地址: https://developer.aliyun.com/mvn/guide 仓库搜索地址: https://mvnrepository.com/ https://repo.maven.apache.org/ maven 本地配置 conf/settings.xml 下载 idea 并配置本地环境 maven Maven 构建 生命周期 Maven 的构建 生命周期 包括 三

    2024年02月07日
    浏览(16)
  • spring boot +微信小程序项目,通过微信公众号实现指定用户消息长期推送

    spring boot +微信小程序项目,通过微信公众号实现指定用户消息长期推送

    用户登录小程序,后台记录用户的小程序openId和用户唯一的UnionId。然后用户触发公众号事件(关注公众号或者发送指定消息),后台获取到用户公众号的openId,再调用接口通过公众号的openId查询用户的UnionId,再和数据库里的UnionId进行匹配,将用户的公众号openId存入数据库。此

    2024年02月03日
    浏览(16)
  • spring boot整合cache使用Ehcache 进行数据缓存

    spring boot整合cache使用Ehcache 进行数据缓存

    之前的文章 spring boot整合 cache 以redis服务 处理数据缓存 便捷开发 带着大家通过spring boot整合了 cache 缓存 那么 我们就来说说 其他服务的缓存 而spring boot默认的缓存方案就是 cache 用simple模式 spring boot的强大在于它的整合能力 它将其他缓存技术整合 统一了接口 简单说 所有的

    2024年02月19日
    浏览(9)
  • spring boot 项目整合 websocket

    spring boot 项目整合 websocket

            负责的项目有一个搜索功能,搜索的范围几乎是全表扫,且数据源类型贼多。目前对搜索的数据量量级未知,但肯定不会太少,不仅需要搜索还得点击下载文件。           关于搜索这块类型 众多,未了避免有个别极大数据源影响整个搜索效率,我采用多线程异步

    2024年02月11日
    浏览(12)
  • Spring Boot 如何整合高性能数据库连接池HikariCP

    Spring Boot 如何整合高性能数据库连接池HikariCP

    当使用Spring Boot整合HikariCP时,您可以更加详细地配置和优化连接池以获得更好的性能。以下是更详细的步骤和示例代码: 步骤1:创建Spring Boot项目 您可以使用Spring Initializr(https://start.spring.io/)创建一个新的Spring Boot项目。确保选择适合您的需求的依赖项,例如Web和Spring D

    2024年02月05日
    浏览(12)
  • Spring Boot项目使用RabbitMQ队列

    Spring Boot项目使用RabbitMQ队列

    一、Rabbitmq的安装 RabbitMQ是一个开源的遵循 AMQP协议实现的基于 Erlang语言编写,**即需要先安装部署Erlang环境再安装RabbitMQ环境。 erlang的安装在windows中直接点击安装即可。 安装完erlang后设置erlang的环境变量ERLANG_HOME。 然后安装rabbitmq。 安装成功后。 可以在浏览器中输入http:

    2024年02月02日
    浏览(7)
  • Spring Boot实战 | 如何整合高性能数据库连接池HikariCP

    Spring Boot实战 | 如何整合高性能数据库连接池HikariCP

    专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow专栏:https://blog.csdn.net/superdangbo/category_869

    2024年02月08日
    浏览(15)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包