Spring Boot + RabbitMQ 实现订单过期自动取消功能
场景:在京东下单,订单创建成功,等待支付,一般会给 30 分钟的时间,开始倒计时。如果在这段时间内用户没有支付,则默认订单取消。
如何订单超时实现?
定时任务
redission 延时任务
rabbitmq 死信队列
本文将以 rabbitmq 死信队列展开做讲解,因为定时任务的方式,是有点问题的,原本业务系统希望 10 分钟后,如果订单未支付,就马上取消订单,并释放商品库存。但是一旦数据量大的话,就会加长获取未支付订单数据的时间,部分订单就做不到 10 分钟后取消了,可能是 15 分钟,20 分钟之类的。这样的话,库存就无法及时得到释放,也就会影响成单数。而使用 rabbitmq 死信队列,在定义业务队列时可以考虑指定一个死信交换机,并绑定一个死信队列。当消息变成死信时,该消息就会被发送到该死信队列上,再取出订单信息进行判断订单是否已支付,如未支付则讲订单状态修改为取消状态,这样也是可以达到订单超时取消的需求的。
软件准备
erlang
请参考 Win10 下安装 erlang
https://blog.csdn.net/linsongbin1/article/details/80170487
RabbitMQ
https://blog.csdn.net/linsongbin1/article/details/80170567
启动 RabbitMQ,然后添加一个用户, 并给用户设置权限。
接下来创建一个 springboot 工程,并集成 RabbitMQ。
接下来在 application.yml 配置文件中假如 rabbitmq 配置
定义 RabbitConfig
实现消息发送
消息消费者监听
启动 Spring Boot 应用进行测试
点击其中一个有库存的商品进行购买,先演示一个成功支付的。
接下来再演示支付失败的,并注意控制台日志打印。
通过监听死信队列,消息在进入死信队列之后就可以做一系列业务逻辑处理,比如,消息如果还是未支付状态,将其修改为取消支付。
———END———
如果你喜欢博主的更多文章,请关注博主微信公众号。
版权声明: 本文为 InfoQ 作者【Lonely Sufferer】的原创文章。
原文链接:【http://xie.infoq.cn/article/a5e2640d5f21680feb313a3ab】。文章转载请联系作者。
评论