[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模板网!

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

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

相关文章

  • RabbitMQ和spring boot整合及其他内容

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

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

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

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

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

    2024年02月12日
    浏览(40)
  • 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日
    浏览(65)
  • spring boot +微信小程序项目,通过微信公众号实现指定用户消息长期推送

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

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

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

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

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

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

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

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

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

    2024年02月02日
    浏览(37)
  • 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日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包