2026/2/8 4:54:22
网站建设
项目流程
网站备案是否关闭,外贸专用网站,公司网站开发费能记研发费用哪个科目,论述网站开发建设的一般流程✨ 包含「两种实现方式」#xff1a;注解版#xff08;99% 场景用#xff0c;推荐#xff09; 接口版#xff08;灵活配置#xff09;适配#xff1a;Spring Boot 2.x/3.x 主流版本、Spring MVC#xff0c;教程所有代码可直接复制运行#xff0c;结合上线场景#x…✨ 包含「两种实现方式」注解版99% 场景用推荐 接口版灵活配置适配Spring Boot 2.x/3.x 主流版本、Spring MVC教程所有代码可直接复制运行结合上线场景匹配工作需求特点最简单、最常用、无多余依赖Spring 原生支持不用引入任何额外 jar 包✅ 一、核心说明Spring 的定时任务核心是基于Spring-context内置的定时任务调度器实现分为两种写法Scheduled注解方式→ ✅【强烈推荐】99% 的业务场景都用它极简、高效、代码量最少适合固定时间 / 固定频率执行的任务比如每天凌晨同步数据、每小时清理日志、定时推送消息实现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 核心使用步骤三步搞定创建一个普通的 Spring 组件类加Component注解让 Spring 扫描到在需要定时执行的方法上添加Scheduled注解配置执行规则方法要求无返回值、无入参(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()); } // 示例4Cron表达式执行 (重中之重生产环境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 适用场景当你的定时任务执行规则需要动态修改比如执行频率需要从数据库读取比如配置表存 cron 表达式后台管理页面可修改运行时根据业务场景调整执行时间同一个任务需要多规则执行这种场景用注解版就满足不了了必须用接口版灵活度拉满✔ 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 定时任务的方法规范方法必须是public void修饰 →无返回值、无入参不要抛出受检异常throws Exception有异常要自己捕获处理try/catch否则任务执行失败后会停止调度定时任务类必须被 Spring 管理 → 加Component或Configuration✔ 6.3 避免「任务重复执行」用fixedDelay替代fixedRate→ 必须等上一次执行完再执行下一次分布式项目多服务器部署→ 一定要加「分布式锁」比如 Redis 锁否则多台服务器会同时执行同一个定时任务导致数据错乱 ✔️你的 WEB 排程场景大概率会用到✔ 6.4 权限配置匹配你的上线需求定时任务的配置类 / 执行类无需额外权限如果是后台管理页面配置定时任务开关 / 执行频率→ 给该页面的操作按钮配置 角色权限即可普通用户无修改权限✅ 七、业务场景 适配示例贴合工作给你写一个真实业务的定时任务示例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()); } } }✅ 八、总结零基础也能记住的核心要点✔ 核心三步必会启动类加EnableScheduling→ 开开关写个 Component 类方法加Scheduled(参数)→ 写任务生产必配「多线程池」→ 防阻塞✔ 两种方式选型建议注解版Scheduled→ 99% 场景首选简单、高效、代码少适合固定时间规则接口版SchedulingConfigurer→ 仅动态配置时用灵活度高✔ 核心避坑单线程阻塞 → 配线程池任务重叠 → 用 fixedDelay异常导致任务停止 → 方法内 try/catch 捕获异常