Spring Boot Application 任务调度实现

177 阅读3分钟

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 项目中常用于替代传统的基于 TimerTimerTask 的任务调度方式

参考资料

@EnableScheduling \ @Scheduled \ ThreadPoolTaskScheduler

docs.spring.io/spring-fram…

www.cnblogs.com/mmzs/p/1016…

juejin.cn/post/701323…

第一种姿势

使用 @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

ThreadPoolTaskSchedulerSpring 框架中的一个特定类型的任务调度器,它基于线程池来执行计划任务。

通过实现 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