SpringBoot整合RabbitMQ及其原理分析

article/2025/10/22 4:52:26

上一篇:RabbitMQ基础知识

1、相关依赖

这里无需指定版本号,让其跟着SpringBoot版本走。本示例使用SpringBoot版本号为2.7.10。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency><dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

2、生产者、消费者

创建两个SpringBoot应用,模拟消息生产者与消费者【publisher、consumer】。

2-1生产者

编写配置文件,用户名和密码等自行修改 这里虚拟机的名称是上一篇文章中新建的。

server.port=8082
#rabbitmq服务器ip
spring.rabbitmq.host=localhost
#rabbitmq的端口
spring.rabbitmq.port=5672
#用户名
spring.rabbitmq.username=用户名
#密码
spring.rabbitmq.password=密码
#配置虚拟机
spring.rabbitmq.virtual-host=demo

声明交换机、队列并绑定:

@Configuration
public class RabbitMqConfig {@Beanpublic RabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory) {RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setMessageConverter(jackson2JsonMessageConverter());return rabbitTemplate;}@Beanpublic MessageConverter jackson2JsonMessageConverter() {return new Jackson2JsonMessageConverter();}@Beanpublic DirectExchange getExchange(){return new DirectExchange("directExchange",false,false);}@Beanpublic Queue getQueue(){return new Queue("publisher.addUser",true,false,false);}@Beanpublic Binding getBinding(DirectExchange exchange,Queue queue){return BindingBuilder.bind(queue).to(exchange).with("publisher.addUser");}
}

新建User实体类

@Data
public class User {private Long id;private String name;private String desc;
}

在方法中使用RabbitTemplate来发送消息:

public interface PublisherService {/*** 添加用户* @param user 用户信息*/void addUser(User user);}
@RequiredArgsConstructor
@Service
public class PublisherServiceImpl implements PublisherService{private final RabbitTemplate rabbitTemplate;@Overridepublic void addUser(User user) {rabbitTemplate.convertAndSend("directExchange","publisher.addUser",user);}
}

以上需要注意的就是交换机的名称队列名routingKey。示例中使用的是直连交换机,routingKey需要和队列名保持一致。不懂的可以查看上一篇文章。

controller:

@RequiredArgsConstructor
@RestController
@RequestMapping("/user")
public class UserController {private final PublisherService publisherService;@PostMapping("/add")public void add(){User user = new User();user.setId(1000L);user.setName("黄忠");user.setDesc("老兵不死,只是逐渐凋零");publisherService.addUser(user);}}

2-2消费者

消费者的配置和生产者一样,不赘述了,直接看代码:

@Service
@Slf4j
public class ConsumerService {@RabbitListener(queues ="publisher.addUser")public void addUser(String userStr){User user = JSONObject.parseObject(userStr,User.class);log.info(user.toString());}
}

@RabbitListener 注解是指定某方法作为消息消费的方法,指定队列名称。@RabbitListener 如果标注在类上,需配合 @RabbitHandler 注解一起使用,根据接受的参数类型进入具体的方法中。

2-3测试

消费端在启动时可能会报找不到交换机或队列,只需要让生产者发送一次消息,从控制台就可以看到相关的交换机和队列等信息了。

可以看到消费者成功消费了消息:

3、消费流程

通过上述操作,我们已经会简单地使用RabbitMQ了,接下来了解一下它的整个流程。如此可以让我们掌握的更牢固。

生产者:

  • 生产者连接到Message Broker【也就是RabbitMQ服务】,建立一个连接( Connection)开启一个信道(Channel)。
  • 生产者声明一个交换机,并设置相关属性,比如交换机类型、是否持久化等。
  • 生产者声明一个队列并设置相关属性。
  • 生产者通过路由键【Routing Key】将交换机和队列绑定。
  • 生产者发送消息至RabbitMQ Broker,其中包含路由键、交换器等信息。
  • 相应的交换机根据接收到的路由键查找相匹配的队列。
  • 如果找到,则将从生产者发送过来的消息存入相应的队列中。
  • 如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者
  • 关闭信道。
  • 关闭连接。

消费者:

  • 消费者连接到RabbitMQ Broker ,建立一个连接(Connection),开启一个信道(Channel) 。
  • 消费者向RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数,
  • 等待RabbitMQ Broker 回应并投递相应队列中的消息,消费者接收消息。
  • 消费者确认(ack) 接收到的消息。
  • RabbitMQ 从队列中删除相应己经被确认的消息。
  • 关闭信道。
  • 关闭连接。


http://chatgpt.dhexx.cn/article/38AAwRij.shtml

相关文章

rabbitmq详解

rabbitmq 一、简介二、业务场景1、异步2、应用解耦3、流量削峰 三、下载四、界面认识五、五种模型示例0、springboot依赖配置1、Hello World简单模型2、Work queues工作队列3、Publish/Subscribe发布订阅模型4、Routing路由模型5、Topics主题模型6、消息转换器 六、进阶1、消费…

[RabbitMQ--1] MQ简介

目录 1.MQ 的相关概念 1.1.什么是 MQ&#xff1f; 1.2.为什么要用MQ&#xff1f;MQ的应用场景 1.2.1.流量消峰&#xff1a; 1.2.2.任务异步处理&#xff1a; 1.2.3.应用解耦 2.AMQP和JMS 3.MQ 的分类 1.ActiveMQ 2.Kafka 3..RocketMQ 4..RabbitMQ 4.RabbitMQ 1.四…

什么是RabbitMq?其原理?

什么是RabbitMq&#xff1f; RabbitMQ是一个实现了AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;高级消息队列协议的消息队列服务&#xff0c;用Erlang语言。 rabbitmq原理 1.Producer&#xff1a;即数据的发送方。创建消息并将其发布(发送)到代理服务器 一…

RabbitMQ原理详解

RabbitMQ&#xff1a;我们通常谈到消息队列&#xff0c;就会联想到这其中的三者&#xff1a;生产者、消费者和消息队列&#xff0c;生产者将消息发送到消息队列&#xff0c;消费者从消息队列中获取消息进行处理。对于RabbitMQ&#xff0c;它在此基础上做了一层抽象&#xff0c;…

你应该知道的 9 种 前端设计模式

本篇文章给大家介绍 9 种 前端设计模式。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。 什么是设计模式&#xff1f; 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论&#xff…

前端需要了解的设计模式

什么是设计模式&#xff1f; 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论&#xff0c;而不是现成的代码&#xff0c;当然每种设计模式都有每种语言中的具体实现方式。学习设计模式更多的是理解各种模式的内在思想和解…

前端设计模式应用

前端设计模式应用 什么是设计模式 软件设计中常见问题的解决方案模型: 历史经验的总结与特定语言无关 设计模式背景 模式语言:城镇、建筑、建造 (A Pattern Language:Towns, Buildings,Construction)1977设计模式:可复用面向对象软件的基础 (Design Patterns: Elements of …

web端设计和web前端开发的区别

Web前端开发技术主要包括三个要素&#xff1a;HTML、CSS和JavaScript&#xff01; 它要求前端开发工程师不仅要掌握基本的Web前端开发技术&#xff0c;网站性能优化、SEO和服务器端的基础知识&#xff0c;而且要学会运用各种工具进行辅助开发以及理论层面的知识&#xff0c;包括…

前端开发中常用设计模式-总结篇

本文是向大家介绍前端开发中常用的设计模式&#xff0c;它使我们编写的代码更容易被复用&#xff0c;也更容易被人理解&#xff0c;并且保证代码的稳定可靠性。 1.什么是设计模式 通俗来讲&#xff0c;就是日常使用设计的一种惯性思维。 因为对应的这种思维&#xff0c;以及对…

前端的设计模式有哪些呢

谈谈设计模式~ 文章目录 什么是设计模式设计模式分类1. 结构型模式2. 创建型模式3. 行为型模式具体使用 什么是设计模式 设计模式&#xff0c;是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式是指一种思想和方法论&#xff0c;先有设计思想&#xff0c;才能…

【面试】最新web前端经典面试题试题及答案(持续更新)-html/css、js、vue、http、web安全、前端性能、浏览器、js算法

author: aSuncat JavaScript知识点大全&#xff1a;https://www.yuque.com/webfront/js 所有最新最全面试题&#xff0c;持续更新在语雀。见 语雀-前端面试题&#xff0c;欢迎点击关注~ 阅读目录 html/ css&#xff1a;https://blog.csdn.net/aSuncat/article/details/88789368…

为什么说前端一定要学好设计模式?

设计模式&#xff08;Design Pattern&#xff09;大家一定不陌生。通俗地讲&#xff0c;它是前辈们对代码开发经验的总结&#xff0c;让你写出可扩展、可读、可维护的高质量代码&#xff0c;还能让你在遇到相似的问题、场景时&#xff0c;快速找到更优的解决方案。 也许你会说&…

前端JS设计模式

什么是设计模式 软件设计模式&#xff08;Design pattern&#xff09;&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 比…

前端开发中常用的几种设计模式有哪些

设计模式概览 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论&#xff0c;而不是现成的代码&#xff0c;当然每种设计模式都有每种语言中的具体实现方式。学习设计模式更多的是理解各种模式的内在思想和解决的问题&#…

前端需要了解的9种设计模式

前端需要了解的9种设计模式 什么是设计模式&#xff1f; 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论&#xff0c;而不是现成的代码&#xff0c;当然每种设计模式都有每种语言中的具体实现方式。学习设计模式更多的是…

前端设计模式

作为一个前端新人&#xff0c;学习了设计模式以后&#xff0c;希望能从源头上&#xff0c;用浅显易懂的语言来解释它。当然不一定是正确的&#xff0c;只是我个人对设计模式的一点浅显理解。 创建型设计模式 创建型设计模式&#xff1a;故名思意&#xff0c;这些模式都是用来创…

web前端设计模式

文章目录 浅谈设计模式1.设计模式是什么2.为什么要学设计模式3.SOLID设计原则4.设计模式的核心思想—封装变化5.23种常见设计模式 创建型一、工厂模式&#xff08;Factory Pattern&#xff09;简单工厂1.解决的问题&#xff1a;2.构造器3.使用步骤4.举例 抽象工厂 &#xff08;…

前端常用的8种设计模式

文章目录 1.引入2.单例模式3.装饰器模式3.适配器模式4.观察者模式&#xff08;发布订阅模式&#xff09;5.策略模式6.模板模式7.代理模式8.外观模式9.面试点 1.引入 简介&#xff1a; 设计模式代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计…

前端JavaScript中常见设计模式

1、为啥会有这一篇 &#xff1f; 前两天有个同学问我&#xff0c;然后组内同学也即将分享相关实践内容&#xff0c;此处 在他之前发出&#xff08;早一天发布的发布会&#xff09;&#xff0c;good! 2、是何物&#xff1f; 组件化是前端非常重要的一块内容&#xff0c;现在流…

你必须要会的4种Web前端设计模式

在软件工程领域&#xff0c;设计模式是为了解决特定问题而产生的一些可复用的方法、模板。每一种设计模式都针对性解决某一类场景的问题。设计模式被认为是开发者解决通用问题的最佳实践。 通常我们学习的设计模式&#xff0c;大多数与面向对象的语言相关&#xff0c;比如Java。…