• 苍穹外卖(七) Spring Task 完成订单状态定时处理


    Spring Task 完成订单状态定时处理, 如处理支付超时订单

    Spring Task介绍

    Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。

    应用场景:

    信用卡每月还款提醒

    火车票售票系统处理未支付订单

    入职纪念日为用户发送通知

    点外卖未按时支付取消订单 

    只要是需要定时处理的场景都可以使用Spring Task

    cron表达式

    cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间
    构成规则: 分为6或7个域, 由空格分隔开, 每个域代表一个含义

    每个域的含义分别为: 秒, 分钟, 小时, 日, 月, 周, 年(可选)

    周 是 周几 的意思

    通配符:

    * 表示所有值;

    ? 表示未说明的值,即不关心它为何值;

    - 表示一个指定的范围;

    , 表示附加一个可能值;

    / 符号前表示开始时间,符号后表示每次递增的值;

    cron表达式案例:

    */5 * * * * ? 每隔5秒执行一次

    0 */1 * * * ? 每隔1分钟执行一次

    0 0 5-15 * * ? 每天5-15点整点触发

    0 0/3 * * * ? 每三分钟触发一次

    0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发

    0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发

    0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发

    0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时

    0 0 10,14,16 * * ? 每天上午10点,下午2点,4点

    为了描述这些信息,提供一些特殊的字符。这些具体的细节,我们就不用自己去手写,因为这个cron表达式,它其实有在线生成器。 

    cron表达式在线生成器:在线Cron表达式生成器

    通过cron表达式 定义触发时间

    入门案例

    Spring Task使用步骤 

    1). 导入maven坐标 spring-context(已存在)

     

    2). 启动类添加注解 @EnableScheduling 开启任务调度

    3). 自定义定时任务类 (主要工作,描述任务逻辑) 

            类也要交给容器管理, 所以也要加上@Component 注解

    订单状态定时处理

    需求分析

    用户下单后可能存在的情况:

    • 下单后未支付,订单一直处于“待支付”状态
    • 用户收货后管理端未点击完成按钮,订单一直处于“派送中”状态

    支付超时的订单如何处理? 派送中的订单一直不点击完成如何处理?

    对于上面两种情况需要通过定时任务来修改订单状态,具体逻辑为:

    • 通过定时任务每分钟检查一次是否存在支付超时订单(下单后超过15分钟仍未支付则判定为支付超时订单),如果存在则修改订单状态为“已取消”
    • 通过定时任务每天凌晨1点检查一次是否存在“派送中”的订单,如果存在则修改订单状态为“已完成”

    代码开发

    1). 自定义定时任务类OrderTask(待完善):

     2). 在OrderMapper接口中扩展方法

     3). 完善定时任务类的processTimeoutOrder方法:

    4). 完善定时任务类的processDeliveryOrder方法:

    1. /**
    2. * 处理“派送中”状态的订单
    3. */
    4. @Scheduled(cron = "0 0 1 * * ?")
    5. public void processDeliveryOrder(){
    6. log.info("处理派送中订单:{}", new Date());
    7. // select * from orders where status = 4 and order_time < 当前时间-1小时
    8. LocalDateTime time = LocalDateTime.now().plusMinutes(-60);
    9. List ordersList = orderMapper.getByStatusAndOrdertimeLT(Orders.DELIVERY_IN_PROGRESS, time);
    10. if(ordersList != null && ordersList.size() > 0){
    11. ordersList.forEach(order -> {
    12. order.setStatus(Orders.COMPLETED);
    13. orderMapper.update(order);
    14. });
    15. }
    16. }

     

  • 相关阅读:
    Linux-相关操作
    图像处理与计算机视觉--第五章-图像分割-霍夫变换
    Linux创建删除用户,创建删除组,设置目录所有权,设置目录wre权限
    数据结构(二)——单向有头链表的原理以及简单应用
    junit单元测试
    Liunx环境编程
    网站、小程序常见布局样式记录
    RabbitMQ有什么优缺点
    刘亦菲生日当天,引发了我对正则的思考
    Vue 全局事件总线$bus
  • 原文地址:https://blog.csdn.net/weixin_47786582/article/details/133847068