spring task的使用场景

发布于:2024-10-15 ⋅ 阅读:(124) ⋅ 点赞:(0)

spring task 简介

  • spring task 是spring自带的任务调度框架
  • 按照约定的时间执行某个方法的工具,类似于闹钟

在这里插入图片描述

应用场景

在这里插入图片描述

cron表达式

  • 周和日两者必定有一个是问号

在这里插入图片描述

简单案例

使用步骤

在这里插入图片描述

demo

  • @Component注解表示这是一个Spring的组件,会被Spring容器扫描到,这个定时任务类将会被Spring容器管理
  • @Scheduled注解表示这是一个定时任务,cron属性表示定时任务的执行时间,这里表示每5秒执行一次
/**
 * 自定义定时任务 用于测试
 */
// @Component注解表示这是一个Spring的组件,会被Spring容器扫描到,这个定时任务类将会被Spring容器管理
@Component
@Slf4j
public class MyTask {

    // @Scheduled注解表示这是一个定时任务,cron属性表示定时任务的执行时间,这里表示每5秒执行一次
    @Scheduled(cron = "0/5 * * * * ?")
    public void task1() {
        log.info("task1");
    }
}

真实案例:自动处理超时的订单

需求分析

在这里插入图片描述

代码开发

package com.sky.task;

/**
 * 订单定时任务
 */
@Component
@Slf4j
public class OrderTask {

    @Autowired
    private OrderMapper orderMapper;

    /**
     * 处理超时订单 每隔1分钟执行一次
     */
     @Scheduled(cron = "0 0/1 * * * ?")
    public void processTimeoutOrder() {
        log.info("开始处理超时订单:{}", LocalDateTime.now());

        // 1.查询超时订单 查询状态是未支付的订单,创建时间超过15分钟
        LocalDateTime timeBefore = LocalDateTime.now().minusMinutes(15);
        List<Orders> ordersList = orderMapper.getByStatusAndOrderTime(Orders.PENDING_PAYMENT, timeBefore);

        // 2.关闭超时订单
        if(CollUtil.isNotEmpty(ordersList)) {
            ordersList.forEach(order -> {
                order.setStatus(Orders.CANCELLED);
                order.setCancelReason("超时未支付,自动取消");
                order.setCancelTime(LocalDateTime.now());
                orderMapper.update(order);
            });
        }

    }

    /**
     * 处理发货订单 每天凌晨1点执行
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void processDeliveryOrder() {
        log.info("开始昨日日处理发货订单:{}", LocalDateTime.now());

        // 1.查询昨日发货订单 查询状态是派送完成的订单,创建时间是 使用的条件是当前时间减去一小时
        LocalDateTime yesterday = LocalDateTime.now().minusHours(1);
        List<Orders> ordersList = orderMapper.getByStatusAndOrderTime(Orders.DELIVERY_IN_PROGRESS, yesterday);

        // 2.发货订单的状态修改为完成
        if(CollUtil.isNotEmpty(ordersList)) {
            ordersList.forEach(order -> {
                order.setStatus(Orders.COMPLETED);
                orderMapper.update(order);
            });
        }
    }

}


网站公告

今日签到

点亮在社区的每一天
去签到