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>
相关推荐
凯基迪科技1 小时前
exe软件壳的分类----加密保护壳
java
wuxuanok1 小时前
Web后端开发-分层解耦
java·笔记·后端·学习
31535669131 小时前
ClipReader:一个剪贴板英语单词阅读器
前端·后端
ladymorgana1 小时前
【Spring Boot】HikariCP 连接池 YAML 配置详解
spring boot·后端·mysql·连接池·hikaricp
kyle~1 小时前
C/C++字面量
java·c语言·c++
neoooo2 小时前
别慌,Java只有值传递——一次搞懂“为啥我改了它还不变”!
java·后端·spring
秋难降2 小时前
Python 知识 “八股”:给有 C 和 Java 基础的你😁😁😁
java·python·c
wuxuanok2 小时前
Web后端开发-请求响应
java·开发语言·笔记·学习
用户7785371836962 小时前
一力破万法:从0实现一个http代理池
后端·爬虫
livemetee2 小时前
spring-ai 1.0.0 (3)交互增强:Advisor 顾问模块
java