欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > [苍穹外卖]-09Spring Task定时任务

[苍穹外卖]-09Spring Task定时任务

2025/5/15 16:01:25 来源:https://blog.csdn.net/CSDN20221005/article/details/142164439  浏览:    关键词:[苍穹外卖]-09Spring Task定时任务

Spring Task

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

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

cron表达式就是一个字符串,可以定义任务触发的时间

  1. 构成规则: 分为6或7个域, 由空格隔开,每个域代表一个含义
  2. 每个域的含义分别为: 秒, 分钟, 小时, 日, 月, 周, 年(可选)
  3. 年这个域是可选的, 所以域有可能是6个也可能是7个

  1. 特殊符号: * 表示通配/所有, ? 号表示忽略/不指定, /表示间隔
  2. cron表达式在线生成器: 在线Cron表达式生成器

入门案例

  1. 导入maven坐标, spring-context中自带

  1. 通过@EnableScheduling 注解开启任务调度
@SpringBootApplication
@EnableScheduling //开启任务调度
public class SkyApplication {public static void main(String[] args) {SpringApplication.run(SkyApplication.class, args);log.info("server started");}
}
  1. 自定义定时任务类
@Component
@Slf4j
public class MyTask {/*** 定时任务,每隔5秒执行一次*/@Scheduled(cron = "0/5 * * * * ?")public void executeTask() {log.info("定时任务开始执行:{}", new Date());}
}
  1. 定时任务类需要交给IOC容器管理
  2. 执行效果: 每隔5秒打印一次内容

订单状态定时处理

用户下单后可能存在的问题:

订单超时处理: 下单后未支付, 订单一直处于"待支付"状态, 如果不处理, 系统中就会存在大量的完不成的订单

用户收到货之后, 商家不点击完成按钮, 订单一直处于"派送中"状态, 如果不处理, 系统中就会存在大量无效订单

  1. 支付超时自动取消: 通过定时任务, 每分钟检查一次, 如果支付超时订单(下单15分为限), 自动修改订单状态为"已取消"
  2. 订单自动完成: 通过定时任务, 每天凌晨1点检查一次, 如果有"派送中"的订单, 则自动把订单状态改为"已完成"

业务实现

在启动类中添加 @EnableScheduling注解 开启任务调度, 新建定时任务类, 编写定时任务方法

@Component
@Slf4j
public class OrderTask {@Autowiredprivate OrderMapper orderMapper;/*** 处理订单超时的方法*/@Scheduled(cron = "0 * * * * ?") // 每分钟触发一次public void processTimeoutOrder() {log.info("定时处理超时订单: {}", LocalDateTime.now());// 计算超时时间LocalDateTime time = LocalDateTime.now().plusMinutes(-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 * * ?") // 每天凌晨1点出发一次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);}}}}
@Mapper
public interface OrderMapper {/*** 根据订单状态和超时时间查询订单* @param status* @param orderTime* @return*/@Select("select * from orders where status = #{status} and order_time < #{orderTime}")List<Orders> getByStatusAndOrderTimeLT(Integer status, LocalDateTime orderTime);}
  1. 定时任务类通过 @Component 注解交给IOC容器管理
  2. 所以在定时任务类处于spring环境中, 可以注入其他的Bean对象

功能测试: 定时任务不能通过接口文档或者前端程序进行测试, 可以修改定时任务的触发时间进行测试

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词