您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
尚硅谷RabbitMQ视频-017-进阶篇-SpringBoot整合-生产者端
发布时间:2026-10-31 16:37:02编辑:雪饮阅读()
-
消费者
接续上篇,这次主要是用spring-boot来实现rabbitmq队列,首先是消费者,首先是把之前的pom.xml中更新下依赖
pom.xml:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>rabbitMqLearning</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- spring-boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.5</version>
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.16.0</version>
</dependency>
<!-- spring-boot rabbitmq amqp 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- spring-boot web依赖 -->
<!-- (注意默认会占用本地8080端口,若已经被占用,则可能无法启动) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring-boot lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>连接信息
接下来写配置文件src\main\resources\application.yml:
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: 123456
virtual-host: /
logging:
level:
org.example.springBoot.listener.MyMessageListener: info然后是消费端监听器
MyMessageListener.java:
package org.example.springBoot.listener;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.stereotype.Component;
//没有这个注解,消费者不会监听队列,也不会接收消息
@Component
@Slf4j
public class MyMessageListener {
public static final String EXCHANGE_DIRECT = "exchange.direct.order";
public static final String ROUTING_KEY = "order";
public static final String QUEUE_NAME = "queue.order";
/*
* 监听队列,不存在则创建
* */
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = QUEUE_NAME, durable = "true"),
exchange = @Exchange(value = EXCHANGE_DIRECT),
key = {ROUTING_KEY}
))
public void processMessage(String dataString, Message message, Channel channel) {
System.out.println("消费端接收到了消息:" + dataString);
}
}
这里监听注解还有一种就是仅仅监听队列不创建队列的写法
// 写法二:仅仅监听队列,不自动创建
//@RabbitListener(queues = {QUEUE_NAME})
public void processMessage(String dataString, Message message, Channel channel) {
System.out.println("消费端接收到了消息:" + dataString);
}
消费类型
首先先了解下这个

在在左侧 Project 面板,找到顶部的 小齿轮 ⚙️(设置图标),点一下弹出菜单里面有个平展模块和平展软件包最好都不勾选,不然如果你某个包下面只有一个包,那么会直接显示为“父包.子包”这种一行的形式,不会自动展开为树状,那么你操作的时候就新建java类很容易直接建立到最末端包的下面了。
接下来就是消费者主(入口)程序
RabbitMQConsumerMainType.java:
package org.example.springBoot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class RabbitMQConsumerMainType {
//运行main方法使得消费者监听队列(注意默认会占用本地8080端口,若已经被占用,则可能无法启动)
public static void main(String[] args) {
SpringApplication.run(RabbitMQConsumerMainType.class, args);
}
}跑消费端
运行消费者端的main方法后,然后在rabbitmq的后台管理端的queues and streams里面就可以看到刚才监听的队列了,不过需要注意的是管理端右上角有个选项在Refreshed右侧的下拉框默认可以看到刷新时间是5秒1刷新,所以有时候没有看到,可能需要等下次刷新后才能看到。当然这个刷新时间可以修改为5秒,10秒,30秒,或者不刷新(不刷新情况可能就依赖浏览器的刷新了)。

同样的,对应交换机也是有了的,以及路由键也是有了的。那其实在rabbitmq的后台中,也可以手动新增队列。
生产者
pom.xml中增加测试依赖
<!--用测试依赖来实现实现生产者-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
然后是生产者
RabbitMQTest.java:
package org.example.springBoot;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class RabbitMQTest {
public static final String EXCHANGE_DIRECT = "exchange.direct.order";
public static final String ROUTING_KEY = "order";
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void test01SendMessage() {
rabbitTemplate.convertAndSend(EXCHANGE_DIRECT, ROUTING_KEY, "Hello Rabbit!SpringBoot!");
}
}
运行这个test01SendMessage,消费者那边就收到消息了。
这是 RabbitMQ 的 路由模式(Routing Mode / Direct Exchange) 。
判断依据 :
特征 代码 说明
使用 Exchange ✅ 不是直接发送到队列
使用 Routing Key ✅ 精确匹配路由键`order`
Exchange 类型 Direct(默认) `@Exchange` 未指定 type,默认为 direct
消费者数量 1个 不是工作模式的竞争消费
为什么不是其他模式 :
- 简单模式 :生产者直接发送到队列,不使用 Exchange ❌
- 工作模式 :一个队列多个消费者竞争消费 ❌
- 发布/订阅模式(Fanout) :Exchange 类型为 fanout,消息广播到所有绑定队列,不使用 routing key ❌
- 主题模式(Topic) :Exchange 类型为 topic,routing key 使用通配符(如`order.*` )❌
路由模式的核心特点 :
- 使用 Direct Exchange
- 通过 routing key 精确匹配 决定消息路由到哪个队列
补充下刚才监听队列哪里默认交换机类型
/*
* 监听队列,不存在则创建
* */
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = QUEUE_NAME, durable = "true"),
//这里仅仅指定了交换机名称,没有指定交换机类型,默认是direct交换机类型
exchange = @Exchange(value = EXCHANGE_DIRECT),
key = {ROUTING_KEY}
))
关键字词:SpringBoot 整合 RabbitMQ 生产者,SpringBoot RabbitMQ 生产者,尚硅谷 RabbitMQ 教程,RabbitMQ 进阶篇
下一篇:返回列表