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

秒杀-订单创建消费者CreateOrderConsumer

这个类是基于MassTransit框架的消息消费者,负责接收 “库存扣减成功” 的消息并创建秒杀订单,同时通过消息通知库存服务确认订单状态。

using MassTransit;
using MassTransit.Transports;
using SqlSugar;
using System.Transactions;
using ZR.Common.Model;
using ZR.Model.Stock;
using ZR.Service.Stock.IStockService;/// <summary>
/// 订单创建消息消费者
/// 负责消费 CreateOrderMessage 消息,完成秒杀订单的创建
/// </summary>
public class CreateOrderConsumer : IConsumer<CreateOrderMessage>
{// 本地消息表服务(操作库存服务的消息记录)private readonly IStockMessageService _StockMessageService;// 秒杀订单服务(操作订单数据库)private readonly ISeckillOrderService _SeckillOrderService;// SqlSugar 数据库客户端(用于事务管理)private readonly ISqlSugarClient _SqlSugarClient;// MassTransit 消息总线(用于发送确认消息)private readonly IBus _bus;/// <summary>/// 构造函数注入依赖/// 通过依赖注入获取所需服务,解耦组件间依赖/// </summary>public CreateOrderConsumer(IStockMessageService stockMessageService, ISeckillOrderService seckillOrderService,ISqlSugarClient sqlSugarClient, IBus bus){_StockMessageService = stockMessageService;_SeckillOrderService = seckillOrderService;_SqlSugarClient = sqlSugarClient;_bus = bus;}/// <summary>/// 消费消息的核心方法/// 当 CreateOrderMessage 消息到达时自动调用/// </summary>public async Task Consume(ConsumeContext<CreateOrderMessage> context){Console.WriteLine("_____________________CreateOrderConsumer____________");var message = context.Message; // 获取消息内容(订单号、商品ID、用户ID等)// 1. 幂等性检查:判断订单是否已存在(防止消息重复消费导致重复创建订单)var exist = await _SeckillOrderService.GetFirstAsync(x => x.OrderNo == message.OrderNo);if (exist != null){// 订单已存在:直接发送“订单创建确认”消息,通知库存服务更新消息状态var uri = new Uri("exchange:stockConfirmQueue.direct?type=direct"); // 目标交换机地址var endPonit = await _bus.GetSendEndpoint(uri); // 获取消息发送端点if (endPonit == null)throw new Exception("消息创建失败");// 发送确认消息(包含订单号)await endPonit.Send(new ConfirmOrderCreatedMessage{OrderNo = message.OrderNo,}, ctx =>{ctx.SetRoutingKey("orderpublic"); // 指定路由键,匹配库存确认队列});return;}// 2. 订单不存在:创建新订单bool dbok = false; // 数据库事务是否成功string mess = "";  // 事务信息try{// 使用 SqlSugar 事务包装订单创建操作(确保原子性)(dbok, mess) = await _SqlSugarClient.UseTranAsync(async () =>{// 创建秒杀订单实体var order = new SeckillOrder{OrderNo = message.OrderNo,   // 订单号(与库存服务生成的一致)GoodsId = message.GoodsId,   // 商品IDUserId = message.UserId,     // 用户IDStatus = "0",                // 订单状态(0-待支付)CreateTime = DateTime.Now,   // 创建时间};// 保存订单到数据库_SeckillOrderService.Add(order);});// 3. 订单创建成功后,发送“订单创建确认”消息var uri = new Uri("exchange:stockConfirmQueue.direct?type=direct");var endPonit = await _bus.GetSendEndpoint(uri);if (endPonit == null)throw new Exception("消息创建失败");await endPonit.Send(new ConfirmOrderCreatedMessage{OrderNo = message.OrderNo,}, ctx =>{ctx.SetRoutingKey("orderpublic");});}catch (Exception ex){// 异常时直接返回(依赖 MassTransit 重试机制重新消费消息)return;}}
}

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

相关文章:

  • 单层前馈神经网络的万能逼近定理
  • C# 如何捕获键盘按钮和组合键以及KeyPress/KeyDown/KeyUp事件之间的区别
  • Windows系统不关闭防火墙,允许某个端口的访问怎么设置?
  • UniApp 多个异步开关控制教程
  • 邯郸哪家公司做企业网站比较专业中国制造网是干什么的
  • 做视频网站把视频放在哪里wordpress建站用什么意思
  • ASP.NET Core Web 应用SQLite数据连接显示(1)
  • 网易门户网站建设网站建设及发布的流程
  • 基于python的jlink单片机自动化批量烧录工具
  • 从三路快排到内省排序:探索工业级排序算法的演进
  • CPP 学习笔记 语法总结
  • Qt 跨平台 2048 游戏开发完整教程 (含源码)
  • SortScope 排序算法可视化
  • 组件库引入
  • 手写Spring第25弹:Spring JdbcTemplate深度解析:数据操作如此简单
  • 《Python 小程序编写系列》(第一部):从零开始写一个猜数字游戏
  • 【完整源码+数据集】草莓数据集,yolov8草莓成熟度检测数据集 3207 张,草莓成熟度数据集,目标检测草莓识别算法系统实战教程
  • 英特尔网站开发框架视频教学互动网站建设
  • DeepSeek-OCR实战(01):基础运行环境搭建-RockyLinux
  • 测开学习DAY26
  • VBA经典应用69例应用9:读取工作表中个数不定的数据
  • 网站建设策划书5000字蚂蚁网站建设
  • 【Janet】比较运算符
  • 05 kafka 如何存储较大数据记录
  • 使用Unity ASE插件设置数值不会生效的问题
  • 【ZeroRange WebRTC】WebRTC 信令安全:实现原理与应用(深入指南)
  • 关于Flutter与Qt for python 的一些技术、开源、商用等问题
  • 国外免费建站网站不用下载设计师培训心得
  • 深入解析 LeetCode 1572:矩阵对角线元素的和 —— 从问题本质到高效实现
  • Android Input ANR分析