当前位置: 首页 > news >正文

RabbitMQ原理及代码示例

1. 问题背景

假设有一个订单服务系统,当用户提交订单后,系统会根据订单信息生成订单,并在订单生成成功后,自动发送邮件提醒用户。为了实现这一过程,系统通常会按照以下顺序同步(从上往下)执行:

用户提交订单。

订单生成成功。

邮件发送成功。

用户收到反馈。

1.1 问题描述

这个同步执行的流程可能带来一些性能和用户体验上的问题。特别是在邮件发送的过程可能会存在一定的延迟,而订单服务又依赖于该过程的成功完成来反馈结果给用户。举个例子,如果有十个用户都生成订单,但是服务器每次只能发3封邮件,那就有7个用户要干等着,这样不仅可能导致响应时间变长,还可能影响系统的可扩展性。

1.2 问题解决

当我们引入了了rabbitMQ,我们就可以将要发邮件做一个任务清单(消息队列),在订单生成以后就返回用户成功了,然后把要发的邮件放入消息队列,然后让服务器慢慢从消息队列里面一条一条数据读,一个邮件一个邮件的发就好了。

在专业的名词解释里面,用户被成为生产者,处理用户请求的服务器被称为消费者,而rabbit所提供的功能就是存储消息队列(任务清单)并且作为交换机连接用户和服务器,如下图

image.png

2. 示例代码

RabbitConfig.java

@Configuration
public class RabbitConfig {@Beanpublic TopicExchange mainExchange() {return new TopicExchange("mainExchange");}@Beanpublic Queue orderQueue() {return new Queue("orderQueue");}@Beanpublic Queue emailQueue() {return new Queue("emailQueue");}@Beanpublic Binding orderBinding(Queue orderQueue, TopicExchange mainExchange) {return BindingBuilder.bind(orderQueue).to(mainExchange).with("order");}@Beanpublic Binding emailBinding(Queue emailQueue, TopicExchange mainExchange) {return BindingBuilder.bind(emailQueue).to(mainExchange).with("email");}
}

MessageSender.java

@Service
public class MessageSender {@Autowiredprivate RabbitTemplate rabbitTemplate;// 发送订单消息public void sendOrderMessage(String message) {rabbitTemplate.convertAndSend("mainExchange", "order", message);}// 发送邮件消息public void sendEmailMessage(String message) {rabbitTemplate.convertAndSend("mainExchange", "email", message);}
}

MessageController.java

@RestController
@RequestMapping("/mq")
public class MessageController {@Autowiredprivate MessageSender sender;// 发送订单消息@GetMapping("/sendOrder")public String sendOrder() {sender.sendOrderMessage("用户下了一个订单!");return "订单消息已发送";}// 发送邮件消息@GetMapping("/sendEmail")public String sendEmail() {sender.sendEmailMessage("发送确认邮件给用户");return "邮件消息已发送";}
}

MessageConsumer.java

@Service
public class MessageConsumer {@RabbitListener(queues = "orderQueue")public void handleOrder(String msg) {System.out.println("📦 订单处理:" + msg);}@RabbitListener(queues = "emailQueue")public void handleEmail(String msg) {System.out.println("📧 邮件处理:" + msg);}
}

application.yml

spring:rabbitmq:host: localhostport: 5672username: guestpassword: guest

http://www.dtcms.com/a/139346.html

相关文章:

  • ESP32之OTA固件升级流程,基于VSCode环境下的ESP-IDF开发,基于阿里云物联网平台MQTT-TLS连接通信(附源码)
  • 2025华中杯B题——AI实现
  • Ubuntu20.04配置cartographer记录
  • 函数递归:递归的概念
  • C#日志辅助类(Log4Net)实现
  • Redis之全局唯一ID
  • 2. 判断列表元素的单一性
  • IO、存储、硬盘、文件系统相关常识
  • IT资产管理(一)之GLPI安装及部署
  • 【信息系统项目管理师】高分论文:论信息系统项目的质量管理(视频大数据平台项目)
  • 数智化招标采购系统分类及功能亮点
  • OpenHarmony - 小型系统内核(LiteOS-A)(五)
  • 时序预测 | Matlab实现基于VMD-WOA-ELM和VMD-ELM变分模态分解结合鲸鱼算法优化极限学习机时间序列预测
  • 【Python】用Python写一个俄罗斯方块玩玩
  • 让SQL飞起来:搭建企业AI应用的SQL性能优化实战
  • debian12安装typora
  • 在 Tailwind CSS 中优雅地隐藏滚动条
  • Electricity Market Optimization 探索系列(VII)- 最优潮流 与 节点边际电价
  • 微信小程序三种裁剪动画有效果图
  • 智能云图库-12-DDD重构
  • pycharm无法识别到本地python的conda环境解决方法
  • Allegro、Etsy、Joom、敦煌测评自养号技术优势
  • AI写论文哪个工具靠谱(四个AI工具对比分析)
  • ACL(访问控制列表)
  • 突破反爬限制的智能数据采集实战 —— 面向中小企业的高效信息监控方案
  • Redis面试问题详解2
  • 开源一体化白板工具Drawnix本地部署打造毫秒级响应的远程协作空间
  • win10和win11系统修复工具各类故障解决
  • DevOps-文章目录
  • Linux 防火墙( iptables )