SpringCloud商城day14 订单处理-2021-10-26

一. RabbitMQ延时消息-> 订单处理

1. 流程: 调用微信支付api-> 查看订单状态-> 未支付则调用关闭订单api-> 修改订单状态为已关闭order-> 回滚库存goods-> 已支付则做补偿操作(修改订单状态和记录日志)

2. 核心: 死信队列-> provider发送的消息不会被立刻消费-> 设定TTL后被consumer消费

3. 创建订单时, 发送延迟消息为订单号-> 系统在限定时间内取出消息-> 查询订单支付转态

4. 死信交换机

(1) 普通队列:队列: queue.ordertimeout(2) 死信交换机(Dead Letter Exchange): TTL到期: 队列长度满了; consumer拒收(requeue=false);name: exchange.ordertimeout type: fanout(类型必须为fanout)
(3) 绑定: Bindings-> To queue-> queue.ordertimeout
(4) 死信队列: Tell Time Live消息过期时间name: queue.ordercreatedurability: DurableAuto delete: NoArguments: x-message-ttl=10000  //消息的生存时间x-dead-letter-exchange=exchange.ordertiemout  //队列的死信交换机

5. 代码实现:

(1) 订单价单-> 发送延迟消息
(2) 消息内容: orderId
(3) 发送到MQ的延迟消息
(4) 订单服务监听消息
(5) 基于微信api-> 查询支付状态
(6) 已支付-> 数据补偿-> MySQL记录日志/订单转态已支付
(7) 未支付-> 基于微信api关闭订单-> MySQL修改订单状态-> 商品库存回滚

调用微信api查询订单/关闭订单 

(1) com.changgou.pay.controller//基于微信查询订单@GetMapping("/query/{orderId}")public Result queryOrder(@PathVariable("orderId")String orderId) {Map map = wxPayService.queryOrder(orderId);return new Result(true, StatusCode.OK, "查询订单成功", map);}//基于微信关闭订单@PutMapping("/close/{orderId}")public Result closeOrder(@PathVariable("orderId")String orderId){Map map = wxPayService.closeOrder(orderId);return new Result(true, StatusCode.OK, "关闭订单成功", map);}(2) com.changgou.pay.service.impl//基于微信查询订单@Overridepublic Map queryOrder(String orderId) {try {Map map = new HashMap();map.put("out_trade_no", orderId);Map resultMap = wxPay.orderQuery(map);return resultMap;} catch(Exception e) {e.printStackTrace();return null;}}//基于微信关闭订单@Overridepublic Map closeOrder(String orderId) {try {Map map = new HashMap();map.put("out_trade_no",orderId);Map resultMap = wxPay.closeOrder(map);return resultMap;} catch(Exception e) {e.printStackTrace();return null;


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部