《苍穹外卖》订单状态定时处理_全部业务代码【简单易懂注释版】
文章介绍了SpringTask定时任务的应用,重点讲解了cron表达式使用及在线生成工具(https://cron.qqe2.com/)。通过订单状态处理案例,展示了具体实现:1)在SkyApplication启动类添加@EnableScheduling注解开启定时任务;2)创建OrderTask类,使用@Scheduled配置两个定时任务:每分钟检查超时未支付订单并自动取消,每天凌晨1点自动完成
·
目录
1.cron表达式在线生成器:https://cron.qqe2.com/
一、Spring Task_介绍

二、Spring Task_cron表达式
1.cron表达式在线生成器:https://cron.qqe2.com/


三、订单状态定时处理


1.SkyApplication.java
主要变动
@EnableScheduling //开启定时任务注解
package com.sky;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@SpringBootApplication
@Slf4j
@EnableScheduling //开启定时任务注解
@EnableTransactionManagement //开启注解方式的事务管理
@EnableCaching //开启spring cache缓存注解功能
public class SkyApplication {
public static void main(String[] args) {
SpringApplication.run(SkyApplication.class, args);
log.info("server started");
}
}
2.OrderTask.java
package com.sky.task;
import com.sky.entity.Orders;
import com.sky.mapper.OrderMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List;
@Component
@Slf4j
public class OrderTask {
@Autowired
private OrderMapper orderMapper;
// 定时处理超时订单
@Scheduled(cron = "0 * * * * ? ") //每分钟触发一次
public void processTimeoutOrder(){
log.info("定时处理超时订单:{}",LocalDateTime.now());
LocalDateTime time = LocalDateTime.now().plusMinutes(-15);
// 每分钟查询当前超时订单
// select * from orders where status = ? and order_time = 当前时间-15分钟
List<Orders> ordersList = orderMapper.getByStatusAndOrderTimeLT(Orders.PENDING_PAYMENT,time);
if (ordersList != null && ordersList.size() > 0) {
for (Orders orders : ordersList) {
orders.setStatus(Orders.CANCELLED);
orders.setCancelReason("订单已超时,系统已自动取消!");
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
}
}
}
// 定时处理一直派送中的订单
@Scheduled(cron = "0 0 1 * * ?") //每天凌晨一点触发一次
//@Scheduled(cron = "0/5 * * * * ?")
public void processDeliveryOrder(){
log.info("定时处理一直派送中的订单:{}",LocalDateTime.now());
LocalDateTime time = LocalDateTime.now().plusMinutes(-60);
List<Orders> ordersList = orderMapper.getByStatusAndOrderTimeLT(Orders.DELIVERY_IN_PROGRESS, time);
if (ordersList != null && ordersList.size() > 0) {
for (Orders orders : ordersList) {
orders.setStatus(Orders.COMPLETED);
orderMapper.update(orders);
}
}
log.info("凌晨一点检查未完成的订单,系统已自动完成!");
}
}
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)