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

spring中自带的执行定时任务的注解是什么?

Spring框架中用于执行定时任务的主要注解是`@Scheduled`。该注解可以添加到方法上,以声明该方法应该按固定的时间间隔执行。Spring的定时任务功能需要配合`@EnableScheduling`注解使用,该注解通常放在配置类上,用于开启对`@Scheduled`注解的支持。### 基本使用步骤1. **在配置类上添加`@EnableScheduling`注解**,以启用定时任务支持。2. **在需要定时执行的方法上添加`@Scheduled`注解**,并配置执行时间。### `@Scheduled`注解的主要属性- `fixedRate`:固定速率执行。任务开始后,每隔指定的时间执行一次,单位毫秒。例如:`@Scheduled(fixedRate = 5000)`表示每隔5秒执行一次。- `fixedDelay`:固定延迟执行。任务结束后,延迟指定的时间再执行下一次,单位毫秒。例如:`@Scheduled(fixedDelay = 5000)`表示任务结束后延迟5秒再执行下一次。- `initialDelay`:初始延迟时间。第一次执行前延迟的时间,单位毫秒。需要与`fixedRate`或`fixedDelay`一起使用。例如:`@Scheduled(initialDelay = 1000, fixedRate = 5000)`表示第一次延迟1秒,之后每隔5秒执行一次。- `cron`:使用Cron表达式定义执行计划。例如:`@Scheduled(cron = "0 0 9 * * ?")`表示每天上午9点执行。### 示例代码#### 1. 启用定时任务```javaimport org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.context.annotation.Configuration;@Configuration@EnableSchedulingpublic class SchedulingConfig { // 配置类,启用定时任务}```#### 2. 使用`@Scheduled`注解```javaimport org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;@Componentpublic class ScheduledTasks { // 固定速率:每隔5秒执行一次(不考虑任务执行时间) @Scheduled(fixedRate = 5000) public void taskWithFixedRate() { System.out.println("Fixed Rate Task: " + System.currentTimeMillis()); } // 固定延迟:任务结束后延迟3秒再执行下一次 @Scheduled(fixedDelay = 3000) public void taskWithFixedDelay() { System.out.println("Fixed Delay Task: " + System.currentTimeMillis()); } // 初始延迟:第一次延迟2秒,之后每隔5秒执行一次 @Scheduled(initialDelay = 2000, fixedRate = 5000) public void taskWithInitialDelay() { System.out.println("Task with Initial Delay: " + System.currentTimeMillis()); } // 使用Cron表达式:每分钟的0秒时执行(即每分钟执行一次) @Scheduled(cron = "0 * * * * ?") public void taskWithCronExpression() { System.out.println("Cron Task: " + System.currentTimeMillis()); }}```### 注意事项1. **默认情况下,所有定时任务在同一个线程池中运行**,该线程池只有一个线程。如果任务执行时间较长,可能会影响其他定时任务的执行。可以通过自定义`TaskScheduler`来配置线程池。2. **自定义线程池示例**: ```java @Configuration @EnableScheduling public class SchedulingConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(5); // 设置线程池大小 taskScheduler.initialize(); taskRegistrar.setTaskScheduler(taskScheduler); } } ```3. **Cron表达式**:Spring支持标准的Cron表达式,有6个字段(秒 分 时 日 月 星期),注意与Unix Cron的7个字段(包含年)不同。例如: - `0 0 9 * * ?`:每天9点执行 - `0 0/5 14 * * ?`:每天14点开始,每隔5分钟执行一次 - `0 15 10 ? * MON-FRI`:周一至周五的10:15执行4. **动态修改定时任务**:Spring的`@Scheduled`注解是静态的,一旦应用启动,执行计划就固定了。如果需要动态修改定时任务,可以考虑使用`ScheduledTaskRegistrar`和`Trigger`接口实现。5. **避免长时间阻塞**:如果任务执行时间超过定时间隔,可能会导致任务重叠执行(对于`fixedRate`)或线程池阻塞。应根据任务特性选择合适的调度策略(如使用`fixedDelay`避免重叠)。### 总结Spring的`@Scheduled`注解是执行定时任务的核心注解,配合`@EnableScheduling`使用,支持固定速率、固定延迟和Cron表达式等多种调度方式。在实际使用中,需要注意线程池配置和任务执行时间,确保定时任务高效可靠运行。

Spring 中执行定时任务的注解详解

在 Spring 框架中,执行定时任务的核心注解是 @Scheduled,配合 @EnableScheduling 注解使用。

核心注解说明

1. @EnableScheduling

  • 位置:配置类上

  • 作用:启用 Spring 的定时任务功能

  • 示例

    java

    @Configuration
    @EnableScheduling // 开启定时任务支持
    public class AppConfig {
    }

2. @Scheduled

  • 位置:方法上

  • 作用:声明方法是定时任务,并配置执行规则

  • 参数

    • cron:Cron 表达式

    • fixedRate:固定速率(毫秒)

    • fixedDelay:固定延迟(毫秒)

    • initialDelay:初始延迟(毫秒)

完整使用示例

配置类(启用定时任务)

java

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableScheduling // 关键:启用定时任务支持
public class SchedulingConfig {
}

定时任务类

java

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class MyScheduledTasks {/*** 使用 Cron 表达式* 每天 9:00 AM 执行*/@Scheduled(cron = "0 0 9 * * ?")public void dailyTask() {System.out.println("执行每日任务: " + new Date());}/*** 固定速率(每5秒执行一次)* 上一次开始后5秒执行下一次,不考虑任务执行时间*/@Scheduled(fixedRate = 5000)public void fixedRateTask() {System.out.println("固定速率任务: " + new Date());}/*** 固定延迟(任务结束后延迟3秒执行下一次)* 上一次执行完成后,延迟3秒再执行*/@Scheduled(fixedDelay = 3000)public void fixedDelayTask() {System.out.println("固定延迟任务开始: " + new Date());try {Thread.sleep(2000); // 模拟任务执行时间} catch (InterruptedException e) {e.printStackTrace();}System.out.println("固定延迟任务结束: " + new Date());}/*** 初始延迟 + 固定速率* 应用启动后延迟10秒开始,之后每2秒执行一次*/@Scheduled(initialDelay = 10000, fixedRate = 2000)public void initialDelayTask() {System.out.println("初始延迟任务: " + new Date());}
}

参数详解

1. Cron 表达式

Spring 支持标准的 Cron 表达式,包含 6个字段(秒 分 时 日 月 星期)

字段允许值特殊字符
0-59, - * /
0-59, - * /
0-23, - * /
1-31, - * ? / L W
1-12 或 JAN-DEC, - * /
星期0-7 (0和7都是周日) 或 SUN-SAT, - * ? / L #

常用示例

  • 0 0 9 * * ?:每天 9:00 AM

  • 0 0/5 14 * * ?:每天 14:00 开始,每隔5分钟

  • 0 15 10 ? * MON-FRI:周一至周五 10:15 AM

  • 0 0 12 1 * ?:每月1日中午12点

2. fixedRate 和 fixedDelay 区别

类型行为适用场景
fixedRate固定速率
上一次开始后指定时间执行下一次
需要严格定期执行的任务
(如:每5秒采集一次数据)
fixedDelay固定延迟
上一次结束后延迟指定时间执行
需要保证任务执行间隔
(如:文件处理任务)

3. initialDelay

  • 仅用于 fixedRate 或 fixedDelay

  • 应用启动后延迟指定时间才开始第一次执行

  • 避免应用启动时立即执行所有任务

高级配置

1. 自定义线程池

java

@Configuration
@EnableScheduling
public class SchedulingConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setPoolSize(10); // 线程池大小scheduler.setThreadNamePrefix("my-scheduler-");scheduler.setAwaitTerminationSeconds(60);scheduler.setWaitForTasksToCompleteOnShutdown(true);scheduler.initialize();taskRegistrar.setTaskScheduler(scheduler);}
}

2. 动态修改定时任务

java

@Service
public class DynamicScheduler {@Autowiredprivate ScheduledTaskRegistrar taskRegistrar;// 动态添加任务public void addTask(String taskName, Runnable task, String cron) {taskRegistrar.addCronTask(new CronTask(task, cron));}// 删除任务public void removeTask(String taskName) {taskRegistrar.getCronTaskList().removeIf(t -> t.toString().contains(taskName));}
}

注意事项

  1. 单线程问题

    • 默认所有定时任务在单个线程执行

    • 长时间运行的任务会阻塞其他任务

    • 解决方案:配置自定义线程池

  2. 集群环境

    • 原生不支持分布式定时任务

    • 集群中每台机器都会执行任务

    • 解决方案:使用分布式调度框架(Quartz + Redis)

  3. 精确时间保证

    • 不保证精确的执行时间(受 JVM 和系统负载影响)

    • 对时间敏感的任务需考虑时间漂移问题

  4. 异常处理

    java

    @Scheduled(fixedRate = 5000)
    public void safeTask() {try {// 业务逻辑} catch (Exception e) {// 异常处理logger.error("定时任务执行失败", e);}
    }

Spring Boot 简化配置

在 Spring Boot 中,只需添加 @EnableScheduling 即可:

java

@SpringBootApplication
@EnableScheduling // Spring Boot 中只需这一句
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

替代方案:Quartz 集成

对于复杂调度需求,可集成 Quartz:

  1. 添加依赖:

    xml

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>
  2. 配置 Quartz 任务:

    java

    @Component
    public class QuartzJob extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context) {// 任务逻辑}
    }@Configuration
    public class QuartzConfig {@Beanpublic JobDetail jobDetail() {return JobBuilder.newJob(QuartzJob.class).storeDurably().build();}@Beanpublic Trigger trigger() {return TriggerBuilder.newTrigger().forJob(jobDetail()).withSchedule(CronScheduleBuilder.cronSchedule("0 0 9 * * ?")).build();}
    }

总结

  1. 核心注解

    • @EnableScheduling:启用定时任务

    • @Scheduled:标记定时执行的方法

  2. 调度类型

    • Cron 表达式:最灵活

    • fixedRate:固定速率

    • fixedDelay:固定延迟

    • initialDelay:初始延迟

  3. 最佳实践

    • 生产环境配置自定义线程池

    • 添加异常处理逻辑

    • 长时间任务使用固定延迟

    • 集群环境使用分布式调度方案

  4. 适用场景对比

场景推荐方案
简单定时任务@Scheduled
复杂调度需求Quartz 集成
分布式环境Quartz + JDBCJobStore
高精度定时专用定时器库(如 netty HashedWheelTimer)

通过合理使用 @Scheduled 注解,可以在 Spring 应用中轻松实现各种定时任务需求。对于复杂场景,建议结合 Quartz 或分布式任务调度框架实现。

http://www.dtcms.com/a/309697.html

相关文章:

  • 铁皮矫平机是什么?
  • 掌握长尾关键词提升SEO
  • 4-verilog简单状态机
  • 使用mybatis生成器生成实体类mapper和查询参数文件,简单spring mvc 项目。使用log4j输出日志到控制台和文件中。使用配置文件注册Bean
  • 【U8+】删除部门的时候提示已经在总账(辅助总账)中使用,不可删除。
  • 从0到1学PHP(十三):PHP 安全编程:构建稳固的应用防线
  • (一)LoRA微调BERT:为何在单分类任务中表现优异,而在多分类任务中效果不佳?
  • 自动化测试准备工作:概念篇
  • Java HTTPS 请求失败排查与证书导入全过程
  • 从豆瓣小组到深度洞察:一个基于Python的舆情分析爬虫实践
  • 【05】VM二次开发——模块参数配置--带渲染/不带渲染(WinForm界面调用 模块参数配置)
  • JVM指针压缩的那些事
  • JVM学习日记(十三)Day13
  • C#线程同步(二)锁
  • 【工具变量大全】上市公司实证研究常用控制变量数据集(2001-2024年)
  • sqli-labs通关笔记-第26a关GET字符注入(多重关键字过滤绕过 手注法)
  • qt贝塞尔曲线演示工具
  • Product Hunt 每日热榜 | 2025-08-01
  • 5-EP4CE10F17C8-引脚配置
  • Fiddler中文版使用指南 提升开发流程的一站式抓包与调试体验
  • 大模型幻觉的本质:深度=逻辑层次,宽度=组合限制,深度为n的神经网络最多只能处理n层逻辑推理,宽度为w的网络无法区分超过w+1个复杂对象的组合
  • 搭建体育直播系统所需的核心数据接入
  • 深度解析:Nginx的卓越性能
  • C# 中生成随机数的常用方法
  • 消息顺序、消息重复问题
  • 在VScode里运行并调试C++程序
  • SpringMVC的拦截器
  • Mermaid流程图可视化系统:基于Spring Boot与Node.js的三层架构实现
  • gradio作为原型工具
  • 专业餐饮直播如何激发食欲与购买欲?