-
SpringBoot中的定时任务主要通过@Scheduled注解以及SchedulingConfigurer接口实现。
-
@Scheduled注解是Spring提供的一个注解,用于标记方法作为定时任务执行:配置方法在指定的时间间隔或时间点执行,实现各种定时任务需求。
//在你需要定时的方法上加上@Scheduled注解,并用corn表达式指定如何定时,下式表达了每隔15秒执行一次方法 @Scheduled(cron = "*/15 * * * * ?") public void hello() { System.out.println("hello执行了"); }
-
但是要记得在启动类上开启定时功能:@EnableScheduling // 开启定时任务功能
-
@Scheduled任务在单线程环境下执行,可能出现任务堆积的情况,尤其在任务量大或任务执行时间长的情况下,而且这些任务可能会变得混乱和难以管理。定时任务的配置分散在各个任务方法中,不利于统一管理和维护。对于需要根据动态条件创建或销毁定时任务的情况,@Scheduled注解也无法满足需求。
-
使用SchedulingConfigurer接口来动态地创建和管理定时任务。通过实现 SchedulingConfigurer 接口,我们可以编写代码来动态地注册和管理定时任务,从而实现灵活的任务调度需求。SchedulingConfigurer 接口是 Spring 提供的一个用于定时任务配置的扩展接口,它允许开发人员更细粒度地控制定时任务的执行。通过实现SchedulingConfigurer接口,可以自定义任务调度器(TaskScheduler),配置线程池等参数,以满足不同场景下的定时任务需求。
@Configuration @EnableScheduling public class CustomSchedulingConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // 定时任务逻辑 } }
-
通过实现SchedulingConfigurer接口,重写configureTasks方法,自定义任务调度器的配置。此外我们还可以配置线程池,用于控制定时任务执行时的线程数量、并发性等参数。
@Bean(destroyMethod = "shutdown") public ThreadPoolTaskScheduler threadPoolTaskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(5); // 设置线程池大小 scheduler.setThreadNamePrefix("scheduled-task-"); // 设置线程名称前缀 scheduler.setAwaitTerminationSeconds(60); // 设置终止等待时间 // 设置处理拒绝执行的任务异常 scheduler.setRejectedExecutionHandler((r, executor) -> log.error("Task rejected", r)); // 处理定时任务执行过程中抛出的未捕获异常 scheduler.setErrorHandler(e -> log.error("Error in scheduled task", e)); return scheduler; } //然后将自定义的ThreadPoolTaskScheduler设置到ScheduledTaskRegistrar中去: @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // 定时任务逻辑 taskRegistrar.setTaskScheduler(threadPoolTaskScheduler()); } //通过SchedulingConfigurer接口,可以更灵活地配置任务调度器和定时任务的执行规则,比如动态注册定时任务、动态修改任务执行规则等。