在应用开发中,定时任务扮演着至关重要的角色,例如定时数据同步、定时邮件发送、定时清理缓存等。Spring Framework 提供了一个强大而灵活的定时任务框架——Spring Task,它可以帮助我们轻松地实现各种定时任务,而无需依赖复杂的第三方库。本文将深入探讨 Spring Task 的使用方法,并结合 Spring Boot 项目进行演示,涵盖 @Scheduled 注解的多种用法、Cron 表达式的详细解释、SchedulingConfigurer 接口的灵活配置以及异步任务的处理。
Spring Task 基于 @Scheduled 注解和 ScheduledExecutorService 线程池,提供了两种主要方式来实现定时任务:
在非 Spring Boot 的 Spring 项目中,需要添加 spring-context 依赖:
***Spring Boot 项目中无需添加依赖***
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>在 Spring Boot 项目的配置类上添加 @EnableScheduling 注解:
@SpringBootApplication
@EnableScheduling //开启定时任务
public class MyApplication {
// ...
}采用注解方式,主要是cron表达式
@Component
public class ScheduledTasks {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
// 每5秒执行一次
@Scheduled(fixedRate = 5000)
public void fixedRateTask() {
System.out.println("Fixed Rate Task : " + dateFormat.format(new Date()));
}
// 每分钟执行一次
@Scheduled(cron = "0 * * * * ?") // 注意:此处纠正了cron表达式
public void cronTask() {
System.out.println("Cron Task : " + dateFormat.format(new Date()));
}
// 上一次任务执行完成后,延迟10秒再执行
@Scheduled(fixedDelay = 10000)
public void fixedDelayTask() {
System.out.println("Fixed Delay Task : " + dateFormat.format(new Date()));
try {
Thread.sleep(5000); // 模拟任务执行时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 使用字符串配置,更灵活,支持占位符
@Scheduled(fixedRateString = "${my.fixedRate}") // application.properties 中配置 my.fixedRate=6000
public void fixedRateStringTask() {
System.out.println("Fixed Rate String Task : " + dateFormat.format(new Date()));
}
}Cron 表达式由6或7个字段组成,用空格分隔,分别表示:
秒 分 时 日 月 周 年举例:(周 和 日 不能同时出现,若一定要同时出现,则其中一个必须为“ ?”,因为会产生冲突)

特殊字符:
更详细的 Cron 表达式示例:
@Configuration
public class TaskSchedulerConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5); // 设置线程池大小为5
executor.setRemoveOnCancelPolicy(true); // 设置取消策略
executor.setThreadNamePrefix("MyScheduled-"); // 设置线程名前缀
return executor;
}
}为了避免阻塞主线程,可以将耗时的定时任务设置为异步执行。
@Component
public class AsyncScheduledTasks {
@Async
@Scheduled(fixedRate = 5000)
public void asyncTask() {
// ... 执行耗时操作 ...
}
}
@Configuration
@EnableAsync // 开启异步任务支持
public class AsyncConfig implements AsyncConfigurer {
// ... 配置异步任务线程池 ...
}编写MyTask 定时任务


/**
* 自定义定时任务类
*/
@Component
@Slf4j
public class MyTask {
/**
* 定时任务 每隔5秒触发一次
*/
@Scheduled(cron = "0/5 * * * * ?")
public void executeTask(){
log.info("定时任务开始执行:{}",new Date());
}
}运行:每隔五秒执行定时任务

Spring Task 提供了强大且灵活的定时任务管理功能,@Scheduled 注解的便捷性和 SchedulingConfigurer 接口的灵活性可以满足各种定时任务的需求。结合异步任务处理,可以进一步优化应用性能。
希望本文能帮助各位看官更深入地理解和使用 Spring Task,在你的项目中优雅地实现定时任务。 感谢各位看官的观看,下期见,谢谢~