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>
相关推荐
程序员天天困几秒前
Arthas ognl 表达式从入门到实战:掌握在线调试最强的表达式引擎
java·jvm·后端
Escape28 分钟前
为什么你的 AI 越聊越傻?从 Token 到 Agent,彻底搞懂 AI Agent的秘密㊙️
前端·人工智能·后端
IT_Octopus37 分钟前
Spring Boot 中 ThreadLocal 请求上下文的完整生命周期
java·spring boot·spring
用户40966601317511 小时前
Lombok 你用对了吗?@Data 之外的 6 个隐藏神器
java·后端·代码规范
梅头脑1 小时前
交易跨10个库、日均千万订单——选错一次分布式事务方案,加班三个月重写
java·分布式
董员外1 小时前
RAG 系统进化论(二):Naive RAG,检索增强生成的最小闭环
前端·人工智能·后端
久久学姐1 小时前
基础转码学 AI:Java+Python 双语言入门,3 个月可落地实战项目
java·python·ai·转码·实战项目
花生了什么事o1 小时前
synchronized 与 ReentrantLock:Java 锁机制原理与实现对比
java·开发语言
掘金一周2 小时前
看看大家每月的成本有多少 | 沸点周刊 7.30
前端·人工智能·后端
aramae2 小时前
C++ IO流完全指南:从C标准库到C++流式编程
服务器·c语言·开发语言·c++·后端