spring task 简介
- spring task 是
spring
自带的任务调度框架
- 按照
约定的时间
执行某个方法的工具,类似于闹钟
应用场景
cron表达式
简单案例
使用步骤
demo
@Component
注解表示这是一个Spring的组件,会被Spring容器扫描到,这个定时任务类将会被Spring容器管理@Scheduled
注解表示这是一个定时任务,cron属性表示定时任务的执行时间,这里表示每5秒执行一次
@Component
@Slf4j
public class MyTask {@Scheduled(cron = "0/5 * * * * ?")public void task1() {log.info("task1");}
}
真实案例:自动处理超时的订单
需求分析
代码开发
package com.sky.task;
@Component
@Slf4j
public class OrderTask {@Autowiredprivate OrderMapper orderMapper;@Scheduled(cron = "0 0/1 * * * ?")public void processTimeoutOrder() {log.info("开始处理超时订单:{}", LocalDateTime.now());LocalDateTime timeBefore = LocalDateTime.now().minusMinutes(15);List<Orders> ordersList = orderMapper.getByStatusAndOrderTime(Orders.PENDING_PAYMENT, timeBefore);if(CollUtil.isNotEmpty(ordersList)) {ordersList.forEach(order -> {order.setStatus(Orders.CANCELLED);order.setCancelReason("超时未支付,自动取消");order.setCancelTime(LocalDateTime.now());orderMapper.update(order);});}}@Scheduled(cron = "0 0 1 * * ?")public void processDeliveryOrder() {log.info("开始昨日日处理发货订单:{}", LocalDateTime.now());LocalDateTime yesterday = LocalDateTime.now().minusHours(1);List<Orders> ordersList = orderMapper.getByStatusAndOrderTime(Orders.DELIVERY_IN_PROGRESS, yesterday);if(CollUtil.isNotEmpty(ordersList)) {ordersList.forEach(order -> {order.setStatus(Orders.COMPLETED);orderMapper.update(order);});}}}