springboot 使用rocketmq实现简单的TCC

商品微服务 

商品扣减库存请求体

@Data
public class GoodsTccRequest {private List<Integer> skuIds;//商品售卖idprivate List<Integer> quantitys;//数量private String orderId;//订单号
}

商品TCC service

public interface GoodsTccService {/*** 订单feign调用扣减库存时使用* */Integer tryStock(GoodsTccRequest request);//生成冻结库存记录,商品库存=商品库存-冻结库存,冻结库存状态=try/*** 监听MQ调用该方法,修改冻结状态* */Integer commitStock(String orderId);//冻结库存状态=commit/*** 监听MQ调用该方法,把冻结的库存加上去* */Integer cancelStock(String orderId);//冻结库存状态=cancle,商品库存=商品库存+冻结库存
}

tcc相关的监听器

@Slf4j
@Service
@RocketMQMessageListener(consumerGroup = "goods_service_stock", topic = "order_create",messageModel= CLUSTERING,consumeThreadMax = 1)//"goods_change"
public class GoodsTccStockListener implements RocketMQListener<String>{@Resourceprivate GoodsTccService goodsTccService;/**监听商品tcc,执行tcc commit或者cancel* **/@Overridepublic void onMessage(String body) {log.info("商品库存监听MQ消费 body {} ",body);JSONObject jsonObject = JSON.parseObject(body);String orderId = jsonObject.getString("orderId");String result = jsonObject.getString("result");if(result.equals("commit")){goodsTccService.commitStock(orderId);}else  if(result.equals("cancel")){goodsTccService.cancelStock(orderId);}}
}

订单服务

商品微服务feign

public interface GoodsTccFeign {/*** 订单feign调用扣减库存时使用* */@PostMapping("/goods/stock/reduce")Integer tryStock(GoodsTccRequest request);//生成冻结库存记录,商品库存=商品库存-冻结库存,冻结库存状态=try
}

mq发送,用于最终一致性,要么cancel,要么commit

@Slf4j
@Component
public class MessageGoodsTccSendProducer {@Autowiredprivate RocketMQTemplate rocketMQTemplate;/*** 异步发送消息* @param orderId 订单id* @param result 请求结果 ("commit","cancel")*/public void asyncSend(String orderId,String result){JSONObject obj = new JSONObject();obj.put("orderId",orderId);obj.put("result",result);Message<String> message = MessageBuilder.withPayload(obj.toJSONString()).build();// 异步发送消息rocketMQTemplate.asyncSend("order_create", message, new SendCallback() {@Overridepublic void onSuccess(SendResult sendResult) {log.info("消息发送Producer, message为:{}, 成功。{}", message.getPayload(), JSONObject.toJSONString(sendResult));}@Overridepublic void onException(Throwable throwable) {log.error("消息发送Producer失败,messageId为:{}, 异常:{}", message.getPayload(), throwable.getMessage());}}, 5000, 0);}
}

下单controller


@RestController
@RequestMapping("/order")
public class OrderCreateController {GoodsTccFeign goodsTccFeign;MessageGoodsTccSendProducer messageGoodsTccSendProducer;@RequestMapping("/create")public Map getCanGotoActivityTag(@RequestParam("skuIds") List<Integer> skuids, @RequestParam("quantitys")List<Integer> quantitys){GoodsTccRequest goodsTccRequest = new GoodsTccRequest();goodsTccRequest.setSkuIds(skuids);goodsTccRequest.setSkuIds(quantitys);String orderId = UUID.randomUUID().toString().replace("-","");goodsTccRequest.setOrderId(orderId);//冻结库存goodsTccFeign.tryStock(goodsTccRequest);//生成订单//如果一切正常String result = "commit";//如果异常//result = "cancel";//发送消息messageGoodsTccSendProducer.asyncSend(orderId,result);Map orderMap = new HashMap<>();return orderMap;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习与机器学习的关系

深度学习和机器学习的关系 深度学习是机器学习的一个子领域&#xff0c;专注于使用神经网络&#xff0c;特别是深度神经网络&#xff08;DNN&#xff09;来解决各种问题。可以说&#xff0c;深度学习是机器学习的一种方法或技术。两者都致力于通过从数据中提取有用的信息或模式…

十七、String 和 StringBuilder

文章目录 String 和 StringBuilder3.1 String基本用法3.2 String底层3.3 不可变性3.4 编码转换3.5 StringBuilder基本用法3.6 StringBuilder基本实现原理3.7 String的和运算符 String 和 StringBuilder 本文为书籍《Java编程的逻辑》1和《剑指Java&#xff1a;核心原理与应用实…

pytorch-textsummary,中文文本摘要实践

pytorch-textsummary&#xff0c;中文文本摘要实践 pytorch-textsummary是一个以pytorch和transformers为基础&#xff0c;专注于中文文本摘要的轻量级自然语言处理工具&#xff0c;支持抽取式摘要等。 目录 数据使用方式paper参考 项目地址 pytorch-textsummary: https://g…

docker (十)-docker compose容器编排

在实际工作中&#xff0c;部署一个应用可能需要部署多个容器&#xff0c;一个一个部署非常不方便。docker compose可以一键部署和启动多个容器&#xff0c;它使用yaml文件来编排服务。github和docker hub很多项目都提供了docker-compose.yaml文件&#xff0c;我们可以一键部署项…

浅谈木材加工企业的电气火灾隐患及电气火灾监控系统的应用

摘要&#xff1a;本文分析了木材加工企业的特点、现状及常见电气火灾隐患&#xff0c;提出了消灭电气火灾隐患的措施。结尾介绍了木材加工企业常用电气设备的选用及电气火灾监控系统在其低压配电系统的应用方案及产品选型。 关键词&#xff1a;木材加工企业&#xff1b;电气火…

redis 异步队列

//produceMessage.ts 模拟生产者 import Redis from ioredis; const redis new Redis(); // 生产者&#xff1a;将消息推送到队列 async function produceMessage(queueName:string, message:string) {try {await redis.rpush(queueName, message);console.log(Produced messa…

Unity摄像机跟随

Unity摄像机跟随 方法一&#xff1a;摄像机子物体 将摄像机直接拖拽到被跟随的目标下面即可&#xff0c;这样摄像机永远在目标的后面 缺点&#xff1a; 屏幕旋转太平滑了目标物体在屏幕上的位置永远不变目标物体被销毁时总不能把摄像机也销毁了吧 方法二&#xff1a;子物体…

19个Web前端交互式3D JavaScript框架和库

JavaScript &#xff08;JS&#xff09; 是一种轻量级的解释&#xff08;或即时编译&#xff09;编程语言&#xff0c;是世界上最流行的编程语言。JavaScript 是一种基于原型的多范式、单线程的动态语言&#xff0c;支持面向对象、命令式和声明式&#xff08;例如函数式编程&am…

从零开始手写mmo游戏从框架到爆炸(十六)— 客户端指定回调路由与登录

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 我们这次来把注册、登录、选择英雄&#xff0c;进入主页-选择地图的功能完善。 在这之前&#xff0c;我们还要解决一个问题&#xff0c;就是服务端往客户端发消息的路由问题…

phpcms v9敏感词内容替换

后台先在"扩展"——>"敏感词管理"中添加敏感词&#xff0c;然后修改phpcms\modules\content\content.php文件来实现添加或者编辑内容时敏感词的替换。&#xff08;如果涉及会员投稿和留言等&#xff0c;也需要在对应模块中做类似处理&#xff09; 在ad…

ADO.NET实现读写分离

在 ADO.NET 中&#xff0c;分片和垂直分表的支持并不是直接提供的&#xff0c;而是需要你在应用程序设计和数据库架构中手动实现。下面是如何在 ADO.NET 中支持分片和垂直分表的一些步骤和策略&#xff1a; 分片 (Sharding) 1. 设计分片策略 首先&#xff0c;你需要设计一个…

《基于CEEMDAN-小波包分析的隧道爆破信号去噪方法》论文思路

相比于小波降噪&#xff0c;小波包分析具有更高的频率分辨率&#xff0c;可以进一步消除高频部分存在的噪声余量&#xff0c;提高去噪精度 依据EEMD 分解的取值范围&#xff0c;利用“试错法”得到本次试验中CEEMDAN分解的特征参数为&#xff1a;正负高斯白噪声标准差为0.2&a…

Linux--shell编程中有关while循环的详细内容

文章关于while循环的内容目录 一、while循环 ​​​​​​​​​​​​​​二、无限循环 ​​​​​​​​​​​​​​三、case语句 ​​​​​​​四、跳出循环 ​​​​​​​​​​​​​​五、break ​​​​​​​六、continue​​​​​​​ ​​​​​​​一、w…

Java Web(六)--XML

介绍 官网&#xff1a;XML 教程 为什么需要&#xff1a; 需求 1 : 两个程序间进行数据通信&#xff1f;需求 2 : 给一台服务器&#xff0c;做一个配置文件&#xff0c;当服务器程序启动时&#xff0c;去读取它应当监听的端口号、还有连接数据库的用户名和密码。spring 中的…

二叉树及其练习题

文章目录 树概念及结构树的概念树的相关概念树的表示形式树的应用 二叉树概念及结构概念两种特殊的二叉树二叉树的性质二叉树的存储二叉树的基本操作二叉树的遍历前中后序遍历递归实现二叉树的基本操作 二叉树相关oj题 树概念及结构 树的概念 树是一种非线性的数据结构&#…

c++:蓝桥杯中的基础算法1(枚举,双指针)

枚举 基础概念&#xff1a; 枚举&#xff08;Enum&#xff09;是一种用户定义的数据类型&#xff0c;用于定义一个有限集合的命名常量。在C中&#xff0c;枚举类型可以通过关键字enum来定义。 下面是一个简单的枚举类型的定义示例&#xff1a; #include <iostream>enum…

【面试题】谈谈MySQL的索引

索引是啥 可以把Mysql的索引看做是一本书的目录&#xff0c;当你需要快速查找某个章节在哪的时候&#xff0c;就可以利用目录&#xff0c;快速的得到某个章节的具体的页码。Mysql的索引就是为了提高查询的速度&#xff0c;但是降低了增删改的操作效率&#xff0c;也提高了空间…

数字经济概念辨析

一些常见的数字经济&#xff0c;数字金融概念辨析 博士学位点-应用经济学、统计学、工商管理、管理科学与工程 可以不懂&#xff0c;但不能装懂&#xff1b;可以不会&#xff0c;但不能不学&#xff1b;可以偷懒&#xff0c;但不能停滞。 增程式和混合动力的电动车都是混合动…

医疗在线问诊小程序:开启数字化医疗新篇章

随着科技的飞速发展&#xff0c;医疗行业正逐步向数字化转型。其中&#xff0c;医疗在线问诊小程序作为一种新型的医疗健康服务模式&#xff0c;为人们提供了更为便捷、高效的医疗咨询服务。本文将探讨医疗在线问诊小程序的发展背景、优势及应用场景&#xff0c;以期为医疗行业…

【JavaScript】模块的导入和导出

文章目录 1. 导出模块1.1 基本导出1.2 默认导出 2. 导入模块2.1 基本导入2.2 导入全部2.3 默认导入 3. 在实际项目中的应用3.1 模块化开发3.2 组织项目结构 4. 模块的导入导出语法比较4.1 命名导出4.2 默认导出 5. 总结 在现代 JavaScript 开发中&#xff0c;模块化编程是一项关…