当前位置: 首页 > news >正文

Spring Task定时任务详解与实战应用

一、Spring Task核心机制

Spring Task是Spring框架内置的轻量级定时任务模块,无需额外依赖即可实现定时任务调度。其核心是TaskScheduler接口和@Scheduled注解。

启用步骤

  1. 在启动类添加@EnableScheduling

    @SpringBootApplication
    @EnableScheduling // 激活定时任务功能
    public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
    }
  2. 在业务方法添加@Scheduled注解

二、@Scheduled参数配置
参数类型示例说明
cron"0 0 1 * * ?"UNIX风格时间表达式
fixedDelayfixedDelay=5000上次执行结束到下次开始的间隔
fixedRatefixedRate=3000固定频率执行(毫秒)
initialDelayinitialDelay=10000首次执行延迟时间(毫秒)
三、Cron表达式详解

Spring Task使用标准的6位cron表达式(7位会报错):

┌──────────── [秒] (0-59)
│ ┌────────── [分] (0-59)
│ │ ┌──────── [时] (0-23)
│ │ │ ┌────── [日] (1-31)
│ │ │ │ ┌──── [月] (1-12 或 JAN-DEC)
│ │ │ │ │ ┌── [周] (0-7 或 SUN-SAT, 0/7=周日)
│ │ │ │ │ │
* * * * * * 

常用表达式示例

  • 0 * * * * * → 每分钟的0秒执行(每分钟一次)

  • 0 0 1 * * ? → 每天凌晨1点执行

  • 0 0/5 9-18 * * MON-FRI → 工作日9-18点每5分钟执行

四、实战案例解析

场景1:订单超时处理(每分钟执行)

@Scheduled(cron = "0 * * * * *") // 每分钟触发
public void processTimeoutOrders() {LocalDateTime cutoffTime = LocalDateTime.now().minusMinutes(15);List<Orders> orders = orderMapper.selectPendingOrdersBefore(Orders.PENDING_PAYMENT, cutoffTime);orders.forEach(order -> {order.setStatus(Orders.CANCELLED);order.setCancelReason("支付超时自动取消");order.setCancelTime(LocalDateTime.now());orderMapper.update(order);});
}

实现逻辑:检查15分钟未支付的订单→批量更新为取消状态

场景2:自动完成配送订单(每天凌晨执行)

@Scheduled(cron = "0 0 1 * * ?") // 每天1:00 AM执行
public void completeDeliveryOrders() {LocalDateTime cutoffTime = LocalDateTime.now().minusHours(1);List<Orders> orders = orderMapper.selectDeliveryOrdersBefore(Orders.DELIVERY_IN_PROGRESS, cutoffTime);orders.forEach(order -> {order.setStatus(Orders.COMPLETED);order.setCompletionTime(LocalDateTime.now());orderMapper.update(order);});
}

实现逻辑:检索派送中超过1小时的订单→自动标记为已完成

五、最佳实践建议
  1. 线程池配置(防止任务阻塞)

spring:task:scheduling:pool:size: 10 # 定时任务线程池大小thread-name-prefix: sched-task-
  1. 分布式环境处理

  • 使用Redis分布式锁:@Scheduled + RedissonLock

  • 数据库悲观锁:SELECT ... FOR UPDATE

  1. 异常处理

@Scheduled(...)
public void scheduledTask() {try {// 业务逻辑} catch (Exception e) {log.error("定时任务执行失败", e);// 告警通知}
}
Spring Task为轻量级定时任务提供了简洁高效的解决方案,适用于单机环境下的常规调度需求。对于分布式场景或复杂调度策略,建议结合Quartz或XXL-Job使用。
http://www.lqws.cn/news/538399.html

相关文章:

  • java中的anyMatch和allMatch方法
  • OSEK/VDX OS ISO17356-3,【1】规范概述
  • SpringBoot项目快速开发框架JeecgBoot——Web处理!
  • linux cp与mv那个更可靠
  • MySQL5.7和8.0 破解root密码
  • 快速傅里叶变换(FFT)是什么?
  • python中学物理实验模拟:斜面受力分析
  • 圆周期性显示和消失——瞬态实现(CAD c#二次开发、插件定制)
  • Nordic nRF54L15 SoC对包含电池监测、中断处理和电源轨控制的定制 nPM1300 示例
  • springcloud 尚硅谷 看到9开头
  • 华为云鸿蒙应用入门级开发者认证 实验(HCCDA-HarmonyOS Cloud Apps)
  • 玄机抽奖Spring Web项目
  • Maven Javadoc 插件使用详解
  • [论文阅读]RaFe: Ranking Feedback Improves Query Rewriting for RAG
  • 解决uniapp vue3版本封装组件后:deep()样式穿透不生效的问题
  • react-嵌套路由 二级路由
  • 事件循环(Event Loop)机制对比:Node.js vs 浏览器​
  • python+requests接口自动化测试
  • 大脑感官:视觉系统中将感观信息转换为神经信号
  • @Autowired 和 @Resource 有什么区别?
  • Java常用设计模式详解
  • linux网络编程socket套接字
  • 【论文阅读】--Instruction Backdoor Attacks Against Customized LLMs
  • Neo4j2.0.1桌面端使用教程(简化版)
  • MySQL 锁的分类
  • WinAppDriver 自动化测试:C#篇
  • EMQ X Broker 配置HTTP 的外部鉴权接口
  • 生物化学 PCR(聚合酶链式反应)引物 制造(固相磷酰胺化学法) 购买 存储
  • 如何在x86_64 Linux上部署Android Cuttlefish模拟器运行环境
  • MySQL事物隔离级别详解