文章目录

  • 1. 超时未支付订单处理
    • 1.1 需求分析
    • 1.2 实现思路
    • 1.3 rabbitmq延迟消息
      • 1.3.1 消息的TTL(Time To Live)
      • 1.3.2 死信交换器 Dead Letter Exchanges
      • 1.3.3 延迟消息处理

1. 超时未支付订单处理

1.1 需求分析

超过限定时间并未支付的订单,我们需要进行超时订单的处理:先调用微信支付api,查询该订单的支付状态。如果未支付调用关闭订单的api,并修改订单状态为已关闭,并回滚库存数。如果该订单已经支付,则做补偿操作(修改订单状态和记录)。

1.2 实现思路

实现步骤:

1.在生成订单时(表中记录订单的创建时间)

2.根据订单的创建时间到30分钟为准,如果订单没有支付

3.将订单生成消息放到死信队列

4.消费死信队列里面的消息: 删除数据库中未付款的订单, 需要去修改商品的库存

如何获取超过限定时间的订单?我们可以使用延迟消息队列(死信队列)来实现。

所谓延迟消息队列,就是消息的生产者发送的消息并不会立刻被消费,而是在设定的时间之后才可以消费。

我们可以在订单创建时发送一个延迟消息,消息为订单号,系统会在限定时间之后取出这个消息,然后查询订单的支付状态,根据结果做出相应的处理。

1.3 rabbitmq延迟消息

使用RabbitMQ来实现延迟消息必须先了解RabbitMQ的两个概念:消息的TTL和死信Exchange,通过这两者的组合来实现上述需求。

1.3.1 消息的TTL(Time To Live)

消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消息分别设置TTL。对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就死了,称之为死信。

我们创建一个队列queue.temp,在Arguments 中添加x-message-ttl 为5000 (单位是毫秒),那每一个进入这个队列的消息在5秒后会消失。

1.3.2 死信交换器 Dead Letter Exchanges

一个消息在满足如下条件下,会进死信交换机,记住这里是交换机而不是队列,一个交换机可以对应很多队列。

(1) 一个消息被Consumer拒收了,并且reject方法的参数里requeue是false。也就是说不会被再次放在队列里,被其他消费者使用。

(2)上面的消息的TTL到了,消息过期了

(3)队列的长度限制满了。排在前面的消息会被丢弃或者扔到死信交换机上。

Dead Letter Exchange其实就是一种普通的exchange,和创建其他exchange没有两样。只是在某一个设置Dead Letter Exchange的队列中有消息过期了,会自动触发消息的转发,发送到Dead Letter Exchange中去。

我们现在可以测试一下延迟队列。

(1)创建死信交换器 exchange.ordertimeout (fanout

(2)创建队列queue.ordertimeout

(3)建立死信交换器 exchange.ordertimeout 与队列queue.ordertimeout 之间的绑定

(4)创建队列queue.ordercreate,Arguments添加

x-message-ttl=10000

x-dead-letter-exchange: exchange.ordertimeout

(5)测试:向queue.ordercreate队列添加消息,等待10秒后消息从queue.ordercreate队列消失,

1.3.3 延迟消息处理

从消息队列queue.ordertimeout 中提取消息,执行订单删除

处理超时订单(超时未付款)的解决方案相关推荐

  1. java订单超时取消设计_quartz框架和关闭超时订单

    Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运 ...

  2. quartz cron 每周一_quartz框架和关闭超时订单

    Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运 ...

  3. 订单超时未支付的解决方案

    订单超时未支付的解决方案 定时任务实现 被动取消 JDK的延迟队列 代码演示 时间轮算法 代码演示 Redis zset 实现延迟任务 代码演示 MQ 延时消息 代码演示 写在最后 在前面的文章 第三 ...

  4. 拼夕夕订单超时未支付自动关闭实现方案!

    " 在开发中,往往会遇到一些关于延时任务的需求.例如:生成订单 30 分钟未支付,则自动取消:生成订单 60 秒后,给用户发短信. 对上述的任务,我们给一个专业的名字来形容,那就是延时任务. ...

  5. 订单超时未支付自动取消5种实现方案

    大家好,我是宝哥! 前言 在开发中,往往会遇到一些关于延时任务的需求.比如最近大家都在忙抢回家的火车票,当你下了一个订单没有支付时,会有一个倒计时,提示你半小时之内支付,否则会自动取消.这样的场景是如 ...

  6. 订单超时未支付自动关闭的几种实现方案

    做电商,就会遇到订单超时问题,而且还经常被拿来面试提问! 今天,周末放假,抽时间给大家总结了几种订单超时未支付自动关闭的实现方案.同时,我手机还有几套电商类从零架构到实现的视频教程,如有需要,可以加我 ...

  7. 订单超时未支付自动取消8种实现方案

    定时轮询 数据库定时轮询方式,实现思路比较简单.启动一个定时任务,每隔一定时间扫描订单表,查询到超时订单就取消. 优点:实现简单. 缺点:轮询时间间隔不好确定,占用服务器资源,影响数据库性能. 惰性取 ...

  8. 订单超时处理方案介绍

    在电商场景下,一个订单流程中有许多环节要用到超时处理,包括但不限于: 买家超时未付款:比如超过15分钟没有支付,订单自动取消. 商家超时未发货:比如商家超过1个月没发货,订单自动取消. 买家超时未收货 ...

  9. 延时任务处理订单超时方案(非定时)

    在开发中,往往会遇到一些关于延时任务的需求.例如 生成订单30分钟未支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是延时任务.那么这里就会产生一个问题 ...

最新文章

  1. 13. 微型计算机中,传送cpu发出的读/写指令的总线是,我的微机原理题库
  2. aMCMC for Horseshoe: algorithms
  3. php反序列化java_PHP反序列化漏洞简介及相关技巧小结
  4. 刚刚,中国估值最高的AI公司一口气发布11款产品,横跨5大领域
  5. python前后台tcp/udp通讯示例
  6. Codeforces Round #374 (Div. 2) C. Journey DP
  7. oracle io错误的是什么意思,磁盘IO错误 导致数据库故障一则
  8. 清华大学杨殿阁 深度解读《汽车数据安全管理若干规定(征求意见稿)》
  9. JAVA游戏引擎!FXGL 教程 总目录
  10. Linux调整网卡MAC地址(指令)
  11. js【详解】arr.splice() 数组拼接
  12. Android错误日志分析
  13. CF1225D Power Products (数论)
  14. 刷脸支付开拓创走在时代的前沿
  15. Nim和anti-Nim
  16. 基于S3C6410WINCE6.0的LCD驱动详解
  17. debian armhf mysql_Debian for ARM
  18. python慕课测验答案_分母有理化12-1=______.
  19. Photoshop制作简洁清新的插画海报图片
  20. 学习ASP.NET的步骤

热门文章

  1. 济南申报高新技术企业不符合的条件
  2. CRM项目实战第一天
  3. 差异表达基因热图怎么看_获得差异表达基因后-基因功能注释
  4. Weex实战分享|Weex在极客时间APP中的实践
  5. 人与计算机进行交互的接口,5种新型人机交互技术
  6. 第一次使用Arduino MKR WIFI 1010
  7. [汇编题]将ax中的16位数分成四组,每组四位,分别放入al,bl,cl,dl中
  8. mysql查最高薪水,使用子查询查找MySQL Employee表的最高和第二最高薪水?
  9. iOS中 Realm的学习与使用 韩俊强的博客
  10. pytorch学习笔记(八):PytTorch可视化工具 visdom