订单到期关闭

文章目录


前言

实习期间在做订单模块。遇到过订单到时关闭的场景。

因为我们在通过回调接收第三方订单状态的时候,使用了rocketmq,在遇到订单超时关闭的场景的时候,为了不引入额外的依赖,我们就继续使用rocketmq的延迟队列来做实现。

同时记录几种刚了解到的订单到期关闭实现方式。


一、场景?

酒店模块中,比如用户下单酒店了。

我们要设置超过多少分钟,就将订单自动取消了。

二、使用步骤

1.项目配置好rocketmq

2.读入数据

创建一个生产者

java 复制代码
public class DelayProduce {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    /**
     * @param topic 主题
     * @param message 消息内容
     * @param delayLevel 分为18个等级,分别对应:1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
     */
    public void sendDelayMessage(String topic, String message, int delayLevel) {
        SendResult sendResult = rocketMQTemplate.syncSend(topic, MessageBuilder.withPayload(message).build(), 10000L, delayLevel);
        log.info("sendtime is {}", DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss").format(LocalDateTime.now()));
        log.info("sendResult is{}", sendResult);
    }

    public void sendCommonMessage(String topic, String message) {
        SendResult sendResult = rocketMQTemplate.syncSend(topic, MessageBuilder.withPayload(message).build(), 10000L);
        log.info("sendtime is {}", DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss").format(LocalDateTime.now()));
        log.info("sendResult is{}", sendResult);
    }
}

创建好订单之后,将订单发送到延迟队列

java 复制代码
public class orderCreator {

    public void create( ... ) {
        
        ...

        delayProduce.sendDelayMessage(
                CERTAIN_TOPIC,
                JSON.toJSONString(order),
                15 // 15代表rocketmq中第15级的延时时长,20分钟
        );

        ...

    }
}

延时队列的消费者,来处理到时间的订单消息

java 复制代码
@RocketMQMessageListener(
        topic = TOPIC,
        consumerGroup = CONSUMERGROUP
)
public class OrderDelayConsumer implements RocketMQListener<String> {

    @Override
    public void onMessage(String message) {
        检测订单是否已经支付成功,如果支付过了,就不管了
        如果仍然没有支付,就取消订单,对订单进行关闭
        if (取消成功) {
            创建message,发送给状态机,转换订单状态为已取消
        }
    }
}

其他方式处理订单到期关闭

定时任务

通过定时任务,去定期扫描到期的订单,做关单操作。比如使用xxl-job。

这样的处理方式的优点是:

  1. 简单 实现容易

缺点也显而易见:

  1. 关单时机不精确,
相关推荐
知守观4 分钟前
Spring Boot 2.1.0 停维护5年,10个依赖4个有CVE——2022年老项目的安全体检报告
spring boot·后端
FYKJ_20105 分钟前
express皖美特色农产品网售系统53118-计算机课程设计、毕业设计
javascript·vue.js·spring boot·mysql·typescript·spark·express
zhanghaha13146 分钟前
Python进阶教程:35_PyQt (保姆级零基础教程)
开发语言·python·pyqt
SimonKing7 分钟前
SSE项目`nexus-sse`持续优化,不一样的视觉效果
java·后端·程序员
斑鸠喳喳7 分钟前
读写锁模式 Read-Write Lock
java·后端
释厄62325 分钟前
多黑洞具现论·物理/生物/金融三域显化·虚拟宇宙黑洞·奇点=0 圆圈
开发语言·数据结构·人工智能·程序人生·安全威胁分析
信誓旦旦的程序猿37 分钟前
【Python 量化取数指南 #09】Python 拿港股通数据:港股通成交与港股财报实测
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据api
FYKJ_201038 分钟前
springboot羽毛球场地管理系统00626-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django
Wx-bishekaifayuan1 小时前
django医院营收信息预测系统49414-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
Wx-bishekaifayuan1 小时前
springboot会议室预约管理系统42030-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游