Spring Boot Application 任务调度实现
编辑历史
2023-07-25 14:38 V0.0.1
Hi, All, 我来水文档了, 这是在水的第一篇文档 :)
2023-07-26 16:15 V0.0.2
使用 Spring 框架的任务调度器 ThreadPoolTaskScheduler 来执行计划任务,在 Spring Boot 项目中常用于替代传统的基于 Timer 和 TimerTask 的任务调度方式
参考资料
@EnableScheduling \ @Scheduled \ ThreadPoolTaskScheduler
第一种姿势
使用
@EnableScheduling注解用于启用Spring的任务调度功能,可以通过在方法上添加@Scheduled注解来实现定时任务的执行
1、使用 IDEA 创建一个 Spring Boot Application
2、使用 @EnableScheduling 注解启用 Spring 的任务调度功能
在使用 @Scheduled 注解定义定时任务之前,需要在 Spring 应用程序的配置类或启动类上添加 @EnableScheduling 注解。这样,Spring 就会扫描并注册带有 @Scheduled 注解的方法,并根据其设定的时间表进行定时执行。
@Configuration
@EnableScheduling
public class ScheduleConfig {
}
通过添加 @EnableScheduling 注解,Spring 会自动创建一个用于执行定时任务的任务调度器,并将带有 @Scheduled 注解的方法交由该调度器来管理和执行。
3、添加定时任务
在方法上添加 @Scheduled 注解来将方法标记为可定时执行的任务
@EnableScheduling
@Configuration
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 3000)
public void reportCurrentTime() {
log.info("The time is now {}", dateFormat.format(new Date()));
}
@Scheduled(fixedDelay = 5000) // 每隔5秒执行一次
public void task1() {
// 执行任务逻辑
}
@Scheduled(cron = "0/3 * * * * *") // 每隔3秒执行一次
public void task2() {
// 执行任务逻辑
}
}
@Scheduled(fixedRate = 3000) is called once every 3000 ms
另一种方式是使用 CRON 表达式,如在 Cron 表达式 @Scheduled(cron = "0/3 * * * * *") 中,我们使用 "0/3 * * * * ?" 定义了每隔3秒执行一次的定时任务。
第二种姿势
@EnableScheduling注解 结合ThreadPoolTaskScheduler任务调度器实现可配置的基于线程池执行定时任务
1、使用 IDEA 创建一个 Spring Boot Application
2、创建 Runnable Task
public class RunnableTask implements Runnable {
private final String taskName;
public RunnableTask(String taskName) {
this.taskName = taskName;
}
@Override
public void run() {
System.out.println("Task " + taskName + " is running in thread: " + Thread.currentThread().getName());
}
}
3、ScheduleConfig
ThreadPoolTaskScheduler 是 Spring 框架中的一个特定类型的任务调度器,它基于线程池来执行计划任务。
通过实现 SchedulingConfigurer 接口,并重写其中的方法,可以对 Spring 的任务调度进行更高级的配置和定制。
@EnableScheduling
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(threadPoolTaskScheduler());
// 创建 CronTask
CronTask cronTask1 = new CronTask(new RunnableTask("first-runnable-task"), "0/1 * * * * ?");
CronTask cronTask2 = new CronTask(new RunnableTask("second-runnable-task"), "0/1 * * * * ?");
taskRegistrar.addTriggerTask(cronTask1);
taskRegistrar.addTriggerTask(cronTask2);
}
// 对任务调度器进行进一步的自定义设置。
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
// 设置线程池大小
threadPoolTaskScheduler.setPoolSize(10);
// 设置线程名称前缀
threadPoolTaskScheduler.setThreadNamePrefix("yang-thread-");
threadPoolTaskScheduler.setAwaitTerminationSeconds(60);
threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
return threadPoolTaskScheduler;
}
}
第三种姿势
下一步计划:动态创建定时任务
暴露 RESTful API 接口实现 添加、修改、删除 动态定时任务
再下一步计划:定时任务出发
任务A 执行完成后 作为 触发条件 触发任务 B