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