Spring Task 实现超时未支付的订单自动取消

1、导入依赖

需要导入spring-context依赖,但这个依赖已经在spring-boot-starter起步依赖中包含了,如下:

2、在启动类上添加@EnableScheduling注解,开启任务调度

less 复制代码
 @SpringBootApplication
 @EnableScheduling // 开启任务调度
 public class SkyApplication {
     public static void main(String[] args) {
         SpringApplication.run(SkyApplication.class, args);
     }
 }

3、自定义定时任务类

以订单的超时未支付时间为15分钟来举例。

订单状态已定义在Orders实体类中,如下:

ruby 复制代码
 @Data
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
 public class Orders implements Serializable {
 ​
     /**
      * 订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
      */
     public static final Integer PENDING_PAYMENT = 1;
     public static final Integer TO_BE_CONFIRMED = 2;
     public static final Integer CONFIRMED = 3;
     public static final Integer DELIVERY_IN_PROGRESS = 4;
     public static final Integer COMPLETED = 5;
     public static final Integer CANCELLED = 6;
     
     /////////////////////////////////////////
     // 略
     /////////////////////////////////////////
 }

自定义定时任务类:

less 复制代码
 @Component
 @Slf4j
 public class OrderTask {
 ​
     @Autowired
     private OrderMapper orderMapper;
 ​
     // 超时未支付订单处理
     // cron表达式,用来定义任务触发的时间,此处表示每分钟触发一次。该表达式怎么写,此处不赘述
     @Scheduled(cron = "0 0/1 * * * ?") 
     public void processPayTimeOut(){
         // 从订单表中查询哪些订单超时了,条件:status = 1 and order_time < 当前时间 - 15mins
         LocalDateTime time = LocalDateTime.now().plusMinutes(-15);
         List<Orders> ordersList = orderMapper.getByStatusAndCreateTimeLT(Orders.PENDING_PAYMENT, time);
 ​
         if (ordersList != null && ordersList.size() > 0){
             for (Orders order : ordersList) {
                 // 设置支付超时订单的状态为 6已取消
                 order.setStatus(Orders.CANCELLED);
                 order.setCancelTime(LocalDateTime.now());
                 order.setCancelReason("订单支付超时");
 ​
                 // 更新数据库中的数据
                 orderMapper.update(order);
             }
         }
     }
 }

OrderMapper:

java 复制代码
 @Mapper
 public interface OrderMapper {
     @Select("select * from orders where status = #{status} and order_time < #{time}")
     List<Orders> getByStatusAndCreateTimeLT(Integer status, LocalDateTime time);
 ​
     void update(Orders orders);
 }

OrderMapper.xml:

xml 复制代码
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.sky.mapper.OrderMapper">
     
     <update id="update" parameterType="com.sky.entity.Orders">
         update orders
         <set>
             <if test="cancelReason != null and cancelReason!='' ">
                 cancel_reason=#{cancelReason},
             </if>
             <if test="rejectionReason != null and rejectionReason!='' ">
                 rejection_reason=#{rejectionReason},
             </if>
             <if test="cancelTime != null">
                 cancel_time=#{cancelTime},
             </if>
             <if test="payStatus != null">
                 pay_status=#{payStatus},
             </if>
             <if test="payMethod != null">
                 pay_method=#{payMethod},
             </if>
             <if test="checkoutTime != null">
                 checkout_time=#{checkoutTime},
             </if>
             <if test="status != null">
                 status = #{status},
             </if>
             <if test="deliveryTime != null">
                 delivery_time = #{deliveryTime}
             </if>
         </set>
         where id = #{id}
     </update>
 </mapper>
相关推荐
明月_清风3 小时前
Muse 登顶 App Store 第一,SDK 直接开源:AI Agent 开始进入下一个阶段
人工智能·后端
leikooo3 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
Ivanqhz4 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
沙漠之主4 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
FPGA小徐5 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
YOLO数据集集合5 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
hsfxuebao5 小时前
Loop Engineering 保姆级教程 + 项目实战
人工智能·后端
知行EDI5 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
笑鸿的学习笔记5 小时前
C++笔记之大块顺序写
java·c++·笔记
打工仔折腾 AI6 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战