Spring Task之Cron表达式

ops/2025/2/7 20:37:28/

🌟 Spring Task高能预警:你以为的Cron表达式可能都是错的!【附实战避坑指南】

开篇暴击:为什么你的定时任务总在凌晨3点翻车?

“明明设置了0 0 2 * * ?,为什么任务每天凌晨3点执行?” —— 来自某位头发渐稀的程序员真实呐喊
在这里插入图片描述


一、Spring Task极速入门(小白必看)

1.1 三行代码开启定时任务

java">@SpringBootApplication
@EnableScheduling // 魔法开关
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}@Component
public class ReportJob {// 每天9点执行(错误示例!后文揭晓原因)@Scheduled(cron = "0 0 9 * * ?")public void generateDailyReport() {// 你的报表生成逻辑}
}

二、Cron表达式深水区(90%的人都踩过这些坑)

2.1 Cron语法速查表(Spring特供版)

字段年(可选)
取值0-590-590-231-311-121-7(1=周日)1970-2099

2.2 暴击灵魂的六连问

  1. *?到底有什么区别?

    • *表示任意值,?表示不指定(仅用于日和周的互斥)
  2. 为什么0 0 0 * * 1不是周一执行?

    • Spring的周字段范围是1-7(1=周日),正确写法:0 0 0 ? * 2(周一)
  3. 如何实现每月最后一天执行?

    • 使用Spring扩展语法:0 0 0 L * ?
  4. 0/5*/5有什么区别?

    • 没区别!都是每隔5单位执行(但建议统一用0/5
  5. 如何避开周末执行?

    java">@Scheduled(cron = "0 0 9 * * 2-6") // 周一到周五
    
  6. 为什么我的任务总是重复执行?

    • 检查线程池配置:spring.task.scheduling.pool.size=5

三、高阶玩家专属技巧(同事看了直呼内行)

3.1 动态修改Cron表达式

java">@Autowired
private ThreadPoolTaskScheduler taskScheduler;// 动态调整报表生成时间为10:30
public void updateReportTime() {taskScheduler.schedule(this::generateDailyReport,new CronTrigger("0 30 10 * * ?"));
}

3.2 分布式环境下的死亡陷阱

单机定时任务在分布式环境重复执行

解决方案:

  • 加Redis分布式锁
  • 改用XXL-JOB等分布式调度框架

四、性能核弹级优化方案

4.1 线程池配置(application.yml)

spring:task:scheduling:thread-name-prefix: my-task- # 线程名前缀pool:size: 10                   # 核心线程数shutdown:await-termination: true    # 优雅关闭await-termination-period: 60s

4.2 监控任务执行时长(AOP实现)

java">@Aspect
@Component
public class TaskMonitorAspect {@Around("@annotation(org.springframework.scheduling.annotation.Scheduled)")public Object monitor(ProceedingJoinPoint pjp) throws Throwable {long start = System.currentTimeMillis();try {return pjp.proceed();} finally {long cost = System.currentTimeMillis() - start;log.info("任务 {} 执行耗时: {}ms", pjp.getSignature(), cost);}}
}

五、血泪总结:Cron表达式十大作死写法

错误写法正确写法翻车现象
0 0 9 * * 10 0 9 ? * 2周日执行而非周一
0 0 12 31 2 *0 0 12 L 2 ?2月31日不存在
0 */5 * * * *0 0/5 * * * *实际效果相同但易读性差
0 0 3 1-7 * 10 0 3 1-7 * 2字段冲突导致意外触发

六、课后彩蛋:在线Cron生成工具推荐

https://cron.qqe2.com/

在这里插入图片描述

“好的定时任务应该是:老板不知道它的存在,但业务离不开它的运行。” —— 佚名


http://www.ppmy.cn/ops/156537.html

相关文章

【技海登峰】Kafka漫谈系列(一)Kafka服务集群的核心组件

【技海登峰】Kafka漫谈系列(一)Kafka服务端的核心组件 一. Broker 完整的Kafka服务是集群Cluster结构,其由多个Kafka服务节点组成,每个物理节点即称为Broker,在实际部署中,每个Broker节点都是一个Kafka实例的服务进程。Broker是Kafka实际的运行单元,负责请求处理、数据…

LeetCode-全排序

题目描述 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输入:nums [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1]]示例 2: 输入:nums [1,2,3] 输出:[[1,2…

iOS文字滚动:使用CATextLayer实现的跑马灯(附源码)

引言 在 iOS 开发中,跑马灯效果(Marquee Effect)是一种常见的文本滚动效果,广泛应用于广告展示、动态消息栏、通知推送等场景。通过跑马灯效果,我们能够以流畅的方式展示超出屏幕范围的文本,提升用户体验。…

【工具篇】ChatGPT:开启人工智能新纪元

一、ChatGPT 是什么 最近,ChatGPT 可是火得一塌糊涂,不管是在科技圈、媒体界,还是咱们普通人的日常聊天里,都能听到它的大名。好多人都在讨论,这 ChatGPT 到底是个啥 “神器”,能让大家这么着迷?今天咱就好好唠唠。 ChatGPT,全称是 Chat Generative Pre-trained Trans…

MTGNN论文解读

模型架构 MTGNN 由多个模块组合而成,目标是捕捉多变量时间序列中的空间(变量间)和时间(时序)依赖。 图学习层:用于自适应地学习图的邻接矩阵,发现变量之间的关系。图卷积模块:根据邻…

汽车自动驾驶AI

汽车自动驾驶AI是当前汽车技术领域的前沿方向,以下是关于汽车自动驾驶AI的详细介绍: 技术原理 感知系统:自动驾驶汽车通过多种传感器(如激光雷达、摄像头、雷达、超声波传感器等)收集周围环境的信息。AI算法对这些传感…

京准:NTP卫星时钟服务器对于DeepSeek安全的重要性

京准:NTP卫星时钟服务器对于DeepSeek安全的重要性 京准:NTP卫星时钟服务器对于DeepSeek安全的重要性 在网络安全领域,分布式拒绝服务(DDoS)攻击一直是企业和网络服务商面临的重大威胁之一。随着攻击技术的不断演化…

旅行社项目展示微信小程序功能模块和开发流程

旅行社当前旅游线路的程序(微信小程序),旨在帮助旅行社更高效地管理线下活动预订,同时为客户提供便捷的报名和查看功能。适用于短途游、团队建设等活动,支持在线预订、缴费及订单管理,可根据用户需求定制更多个性化服务,为公司提升品牌知名度与客户体验。通过简洁明了的…