15. @EnableScheduling 和 @Scheduled 的用法和讲解
在 Java 的 Spring Framework 中,@EnableScheduling 注解用于启用基于注解的定时任务。这使得你可以利用 @Scheduled 注解在指定的时间间隔或时间点执行任务。这通常用在需要定时执行任务的应用程序中,例如定时清理、定时报告、定时从远程服务器拉取数据等场景。
以下是如何在 Spring 应用程序中使用 @EnableScheduling 和 @Scheduled 的基本示例:
1. 开启调度支持**@EnableScheduling**
首先,你需要在一个配置类上添加 @EnableScheduling 注解来启用调度功能:【相当于主类】
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
@Configuration
@EnableScheduling
public class SchedulingConfig {
// 这个类体现可以留空,它的主要作用是开启调度支持
}
2. 定义定时任务@Scheduled
然后,你可以在任何 Spring 管理的 bean 中使用 @Scheduled 注解来定义定时任务。这里有几种不同的方式来指定任务的执行时间:
- Fixed Rate:每隔固定时间执行一次,不考虑任务执行所需时间。
- Fixed Delay:在任务执行完毕后等待固定时间再执行下一次。
- Cron Expression:使用类似 Unix 系统的 cron 表达式来定义复杂的调度策略。
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTasks {
@Scheduled(fixedRate = 5000)
public void performTaskFixedRate() {
System.out.println("Fixed Rate Task - " + System.currentTimeMillis() / 1000);
}
@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void performTaskFixedDelay() {
System.out.println("Fixed Delay Task - " + System.currentTimeMillis() / 1000);
}
@Scheduled(cron = "0 15 10 * * ?") // 每天上午10点15分执行
public void performTaskCron() {
System.out.println("Cron Task - " + System.currentTimeMillis() / 1000);
}
}
在上面的例子中,我们创建了三个不同类型的定时任务。每个任务根据其配置在指定的时间执行。这种方式是非常强大的,可以满足大多数定时执行需求。