当前位置: 首页 > 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

相关文章:

  • 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重构
  • “用鲜血和生命凝结的深厚情谊”——习近平主席署名文章中的中俄友好故事
  • 外交部回应西班牙未来外交战略:愿与之一道继续深化开放合作
  • 老人刷老年卡乘车被要求站着?公交公司致歉:涉事司机停职
  • 中国公民免签赴马来西亚的停留天数如何计算?使馆明确
  • 上海国际电影节特设“走进大卫·林奇的梦境”单元
  • 铁路上海站迎五一返程客流最高峰,今日预计到达75.9万人次