✅ Spring/SpringBoot 定时任务 完整版超详细教程(零基础必会,直接能用)@Scheduled 与 SchedulingConfigurer

✨ 包含「两种实现方式」:注解版(99% 场景用,推荐) + 接口版(灵活配置)

适配:Spring Boot 2.x/3.x 主流版本、Spring MVC,教程所有代码可直接复制运行,结合上线场景,匹配工作需求!特点:最简单、最常用、无多余依赖,Spring 原生支持,不用引入任何额外 jar 包


✅ 一、核心说明

Spring 的定时任务核心是基于Spring-context内置的定时任务调度器实现,分为两种写法:

  1. @Scheduled注解方式→ ✅【强烈推荐】,99% 的业务场景都用它,极简、高效、代码量最少,适合固定时间 / 固定频率执行的任务(比如:每天凌晨同步数据、每小时清理日志、定时推送消息)
  2. 实现SchedulingConfigurer接口方式→ 适合动态配置执行规则(比如:从数据库读取 cron 表达式、运行时修改执行频率)

✅ 二、前置准备:启动类 开启定时任务开关【必做,两种方式都需要】

不管用哪种方式,第一步必须在 SpringBoot 的启动类上,添加注解@EnableScheduling,作用是开启 Spring 定时任务的自动装配功能,缺一不可!

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; // 核心注解:@EnableScheduling 开启定时任务 @EnableScheduling @SpringBootApplication public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }

✅ 三、方式一:注解版@Scheduled实现定时任务(重点,必会!)

✔ 3.1 核心使用步骤(三步搞定)

  1. 创建一个普通的 Spring 组件类(加@Component注解,让 Spring 扫描到)
  2. 在需要定时执行的方法上添加@Scheduled注解,配置执行规则
  3. 方法要求:无返回值、无入参(void 方法名())

✔ 3.2 完整代码示例(直接复制)

import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDateTime; /** * Spring定时任务示例 - 注解版 * 加@Component 交给Spring容器管理 */ @Component public class SpringTaskJob { // ============ 示例1:固定频率执行 (最常用) ============ // fixedRate = 5000 表示:【每隔5秒】执行一次该方法 @Scheduled(fixedRate = 5000) public void taskFixedRate() { System.out.println("固定频率执行 → " + LocalDateTime.now()); } // ============ 示例2:固定延迟执行 ============ // fixedDelay = 3000 表示:【上一次方法执行完毕后,延迟3秒】再执行下一次 // 适合:任务执行时间不确定,避免任务重叠执行 @Scheduled(fixedDelay = 3000) public void taskFixedDelay() { System.out.println("固定延迟执行 → " + LocalDateTime.now()); } // ============ 示例3:初始延迟执行 ============ // initialDelay = 2000 启动项目后,延迟2秒再执行第一次,之后按fixedRate频率执行 @Scheduled(initialDelay = 2000, fixedRate = 6000) public void taskInitialDelay() { System.out.println("初始延迟+固定频率 → " + LocalDateTime.now()); } // ============ 示例4:Cron表达式执行 (重中之重!生产环境90%用它) ============ // cron = "0/10 * * * * ?" 表示:【每隔10秒】执行一次 // cron表达式可以配置「任意时间规则」:每天凌晨、每周几、每月几号、指定时分秒 @Scheduled(cron = "0/10 * * * * ?") public void taskCron() { System.out.println("Cron表达式执行 → " + LocalDateTime.now()); } }

✔ 3.3 启动项目,直接生效

启动 SpringBoot 项目后,控制台会自动打印定时任务的执行日志,无需任何额外配置,零 XML、零其他配置文件


✅ 四、重中之重:@Scheduled核心参数详解(全部常用)

✔ 4.1 固定时间相关参数(简单场景用)

单位:毫秒 (ms),1 秒 = 1000 毫秒

  • fixedRate = 时间值从上一次方法执行开始时间,间隔指定时间就执行下一次 → 不管上一次是否执行完,到点就执行
  • fixedDelay = 时间值从上一次方法执行结束时间,间隔指定时间执行下一次 → 必须等上一次执行完,绝对不会任务重叠 ✔️
  • initialDelay = 时间值:项目启动后,延迟指定时间再执行第一次任务,搭配上面两个参数使用

✔ 4.2 Cron 表达式(复杂时间规则必用,生产首选)

✅ 什么是 Cron 表达式?

Cron 是「时间表达式」,可以配置任意精准的时间规则,格式为秒 分 时 日 月 周 年(年可选,一般省略),Spring 支持的是6 位格式秒 分 时 日 月 周

✅ 常用 Cron 表达式(直接复制粘贴,够用 99% 场景)
# 【常用收藏】直接复制用 0/5 * * * * ? → 每隔5秒执行一次 0 0/1 * * * ? → 每隔1分钟执行一次 0 0 2 * * ? → 每天凌晨2点整执行一次 ✔️(同步数据、备份常用) 0 0 2 1 * ? → 每月1号凌晨2点执行一次 0 0 12 * * ? → 每天中午12点执行一次 0 30 9 * * 1-5 → 周一到周五,每天上午9点30分执行 ✔️(工作日业务处理) 0 0 0 * * 6 → 每周六凌晨0点执行一次

✅ 小技巧:记不住就搜「在线 Cron 表达式生成器」,可视化配置,直接复制即可,不用死记!


✅ 五、方式二:实现接口SchedulingConfigurer动态配置定时任务

✔ 5.1 适用场景

当你的定时任务执行规则需要动态修改,比如:

  1. 执行频率需要从数据库读取(比如配置表存 cron 表达式,后台管理页面可修改)
  2. 运行时根据业务场景调整执行时间
  3. 同一个任务需要多规则执行这种场景用注解版就满足不了了,必须用接口版,灵活度拉满

✔ 5.2 完整代码示例(直接复制)

import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import java.time.LocalDateTime; /** * 动态定时任务 - 实现SchedulingConfigurer接口 * @Configuration + @EnableScheduling 组合注解 */ @Configuration @EnableScheduling public class DynamicTaskJob implements SchedulingConfigurer { // 核心:重写 configureTasks 方法,配置任务 @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // 1. 添加要执行的定时任务逻辑 taskRegistrar.addTriggerTask( // ① 要执行的任务内容(就是你的业务逻辑) () -> System.out.println("动态定时任务执行 → " + LocalDateTime.now()), // ② 动态获取Cron表达式(核心:这里可以从数据库查!) triggerContext -> { // 示例:写死cron,实际开发替换为 → 从数据库配置表查询cron表达式 String cron = "0/8 * * * * ?"; // 返回Cron触发器 return new CronTrigger(cron).nextExecutionTime(triggerContext); } ); } }

✅ 生产改造建议:把上面的String cron = "0/8 * * * * ?"替换成你的数据库查询方法,比如cronMapper.getCronByTaskId("task001"),就能实现「后台改配置,定时任务实时生效」!


✅ 六、生产必备:定时任务 核心注意事项 & 坑点避坑(重点!)

✔ 6.1 定时任务默认是「单线程」执行!(最容易踩的坑)

❌ 问题:

Spring 默认的定时任务调度器是单线程池,如果有多个定时任务,或者一个任务执行时间过长,会导致所有定时任务阻塞排队执行,比如:A 任务执行要 1 分钟,B 任务每隔 10 秒执行,会导致 B 任务一直等 A 执行完才会跑。

✅ 解决方案:配置「多线程定时任务池」(必加!)

创建一个配置类,自定义线程池,让定时任务并行执行,互不影响,完整代码直接复制:

import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; /** * 定时任务多线程配置类 (生产必配) */ @Configuration @EnableScheduling @EnableAsync // 开启异步执行 public class TaskThreadPoolConfig { // 配置定时任务线程池 @Bean public ThreadPoolTaskScheduler threadPoolTaskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(10); // 核心线程数:根据业务设置,一般5-20足够 scheduler.setThreadNamePrefix("spring-task-"); // 线程名前缀,日志排查方便 scheduler.setWaitForTasksToCompleteOnShutdown(true); // 关闭时等待任务执行完成 scheduler.setAwaitTerminationSeconds(60); // 等待时间 return scheduler; } }

配置后,所有定时任务都会在独立线程执行,彻底解决阻塞问题!

✔ 6.2 定时任务的方法规范

  1. 方法必须是public void修饰 →无返回值、无入参
  2. 不要抛出受检异常(throws Exception),有异常要自己捕获处理(try/catch),否则任务执行失败后会停止调度
  3. 定时任务类必须被 Spring 管理 → 加@Component@Configuration

✔ 6.3 避免「任务重复执行」

  1. fixedDelay替代fixedRate→ 必须等上一次执行完再执行下一次
  2. 分布式项目(多服务器部署)→ 一定要加「分布式锁」(比如 Redis 锁),否则多台服务器会同时执行同一个定时任务,导致数据错乱 ✔️(你的 WEB 排程场景大概率会用到)

✔ 6.4 权限配置(匹配你的上线需求)

  1. 定时任务的配置类 / 执行类,无需额外权限
  2. 如果是后台管理页面配置定时任务开关 / 执行频率→ 给该页面的操作按钮配置 角色权限即可,普通用户无修改权限

✅ 七、业务场景 适配示例(贴合工作)

给你写一个真实业务的定时任务示例:

import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * 例行会议 定时任务 - 业务示例 * 比如:每天凌晨1点,同步会议重复数据、发送会议提醒 */ @Component public class MeetingTask { // 注入你的会议业务service @Resource private MeetingService meetingService; // 每天凌晨1点整执行:同步会议REPEAT_ID/REPEAT_CONTENT/REPEAT_ENDDATE数据 @Scheduled(cron = "0 0 1 * * ?") public void syncMeetingRepeatData() { try { // 你的业务逻辑:同步例行会议的重复配置数据 meetingService.syncRepeatMeetingData(); System.out.println("例行会议数据同步完成"); } catch (Exception e) { // 异常捕获,避免任务停止 System.err.println("例行会议数据同步失败:" + e.getMessage()); } } // 每隔30分钟,发送即将开始的会议提醒 @Scheduled(cron = "0 0/30 * * * ?") public void sendMeetingNotice() { try { meetingService.sendMeetingRemind(); System.out.println("会议提醒发送完成"); } catch (Exception e) { System.err.println("会议提醒发送失败:" + e.getMessage()); } } }

✅ 八、总结(零基础也能记住的核心要点)

✔ 核心三步(必会)

  1. 启动类加@EnableScheduling→ 开开关
  2. 写个 @Component 类,方法加@Scheduled(参数)→ 写任务
  3. 生产必配「多线程池」→ 防阻塞

✔ 两种方式选型建议

  1. 注解版@Scheduled→ 99% 场景首选,简单、高效、代码少,适合固定时间规则
  2. 接口版SchedulingConfigurer→ 仅动态配置时用,灵活度高

✔ 核心避坑

  1. 单线程阻塞 → 配线程池
  2. 任务重叠 → 用 fixedDelay
  3. 异常导致任务停止 → 方法内 try/catch 捕获异常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1165431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django基于python的农村医疗健康管理系统的设计与实现

目录农村医疗健康管理系统的设计与实现摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!农村医疗健康管理系统的设计与实现摘要 随着信息技术的快速发展,农村地区的医…

字节跳动 Coze(扣子)万字长文:从“会聊天”到“能交付”的 AI 智能体平台全景解析

目录 第1章 先把话说清楚:你以为你在“做机器人”,其实你在“做产品” 第2章 Coze 到底是什么:官方一句话背后的含义 第3章 为什么 Coze 会火:因为“纯聊天”越来越不够用了 第4章 Coze 的核心对象:智能体&#xff…

同轴投影机和偏轴投影机的区别

投影机同轴和偏轴区别 1. 同轴投影 • 核心定义:投影机镜头的光轴(即投射光线的中心线)与画面的水平中心线完全重合。 • 工作方式:光线笔直地从镜头中心射出,打在屏幕上。为了获得一个方正的、位置合适的画面&#xf…

BMP280气压传感器原理图设计,已量产(压力传感器)

目录 1、电源系统:低噪声是精准感知的基础 2、BMP280 核心电路:不拖传感器性能的后腿 3、电平转换:5V/3.3V 主控的兼容关键 4、硬件兼容性:不用跳线的 “傻瓜式” 适配 做嵌入式项目时,“小而精” 的传感器模块永远是刚需 —— 尤其是需要同时测气压和温度的场景,比如…

槽型光电开关传感器原理图设计,已量产(光电传感器)

目录 1、光电检测前端:信号的 “源” 电路 2、信号缓冲:小器件解决电平与驱动问题 3、电路工作流程:从遮挡到信号输出 4、设计细节:避免踩坑的几个小技巧 在嵌入式设备的位置限位、物料计数等场景中,槽型光电开关是性价比极高的传感器方案 —— 它通过遮挡发射器与接收…

用SQL实现三次指数平滑预测:递归与非递归两种解法详解

目录 一、三次指数平滑法基础 1.1 核心原理 1.2 数据源说明 二、解法一:递归CTE实现 2.1 完整代码 2.2 关键解析 三、解法二:非递归(LAG窗口函数)实现 3.1 完整代码 3.2 关键解析 四、两种解法对比 五、实战注意事项 …

全网最全本科生必用TOP10 AI论文网站测评

全网最全本科生必用TOP10 AI论文网站测评 2026年本科生学术写作工具测评:为何需要一份权威榜单? 随着人工智能技术在教育领域的深入应用,越来越多的本科生开始依赖AI论文网站提升写作效率和质量。然而,面对市场上五花八门的工具&a…

django基于python的旅游个性化定制平台的设计与实现

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 随着旅游业的快速发展,个性化旅游定制需求日益增长。传统的旅游平台往往提供标准化产品,难以满…

隐私计算新范式:基于联邦学习的大数据解决方案

隐私计算新范式:基于联邦学习的大数据解决方案 关键词:隐私计算、联邦学习、数据安全、分布式训练、大数据协同 摘要:在数据成为“新型石油”的今天,如何在不泄露隐私的前提下实现数据价值的协同挖掘,是全球企业和科研机构面临的核心挑战。本文将以“联邦学习”这一隐私计…

一文读懂集群与分布式:两种核心服务器架构的本质差异

在互联网技术飞速发展的今天,我们日常使用的购物 App、短视频平台、在线办公工具等,背后都离不开庞大的服务器体系作为支撑。当业务规模不断扩大,单一服务器的性能、并发能力和稳定性逐渐达到瓶颈时,“集群”和“分布式”这两种架…

django基于python的旅游服务管理系统

目录 Django 基于 Python 的旅游服务管理系统摘要 关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! Django 基于 Python 的旅游服务管理系统摘要 旅游服务管理系统旨在通过信息化手…

主流深度学习框架全景对比:PyTorch、TensorFlow、JAX的发展、特性与工程落地

深度学习框架是AI研发的“基础设施”,不同框架的设计哲学、技术特性与生态适配性,直接决定了研发效率、工程落地难度和性能表现。本文系统梳理PyTorch、TensorFlow、JAX三大主流框架的发展脉络,拆解核心特性差异,并结合实际工程场…

django基于python的流浪宠物领养管理系统

目录Django 基于 Python 的流浪宠物领养管理系统摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!Django 基于 Python 的流浪宠物领养管理系统摘要 随着城市化进程加快&#xff…

学霸同款8个AI论文平台,本科生轻松搞定毕业论文!

学霸同款8个AI论文平台,本科生轻松搞定毕业论文! AI 工具如何助力论文写作? 在当今学术研究日益复杂的背景下,越来越多的本科生开始借助 AI 工具来提升论文写作效率。这些工具不仅能帮助学生快速生成内容,还能有效降…

开发基于大模型的金融专业教材章节总结生成器

开发基于大模型的金融专业教材章节总结生成器 关键词:大模型、金融专业教材、章节总结生成器、自然语言处理、文本生成 摘要:本文旨在详细阐述开发基于大模型的金融专业教材章节总结生成器的全过程。从背景介绍入手,深入探讨核心概念、算法原理、数学模型等内容,通过项目实…

Java--打印流

基本介绍在整个IO包中,打印流是输出信息做方便的类,主要包含字节打印流(PrintStream)和字符打印流(PrintWriter)。打印流提供了非常方便的打印功能,可以打印任何的数据类型,例如:小数、整数、字符串等等代码说明PrintS…

AI Agent在风险管理中的应用

AI Agent在风险管理中的应用关键词:AI Agent、风险管理、智能决策、自动化、风险评估摘要:本文深入探讨了AI Agent在风险管理领域的应用。首先介绍了相关背景,包括目的、预期读者等内容。接着阐述了AI Agent和风险管理的核心概念及联系&#…

UE5 C++(33):单播代理,宏 DECLARE_DELEGATE_xParam(代理名,参数序列)。

(172)概念, 在 C 标准库的容器实现上,也使用了代理,迭代器的代理,该代理关联了容器与其上的迭代器 :(173)本类的初始状态 :(174)宏 DE…

提示工程架构师揭秘:提示工程如何重塑大数据分析生态

提示工程架构师揭秘:提示工程如何重塑大数据分析生态 1. 引入与连接:大数据分析师的“效率困境”与破局点 深夜十点,小张揉着发涩的眼睛盯着电脑屏幕——他是某零售企业的大数据分析师,今天的任务是分析“2023年双11期间华北地区母…