[] - 2022-09-25 SpringBoot 设置动态定时任务,千万别再写死了~.pdf

preview
需积分: 0 0 下载量 115 浏览量 更新于2023-12-11 收藏 808KB PDF 举报
在SpringBoot应用中,我们经常需要使用定时任务来执行一些周期性的操作,如数据同步、报表生成等。传统的定时任务通常会使用`@Scheduled`注解配合cron表达式来预先定义,但这种方式的缺点在于任务的执行时间一旦设定,便无法在运行时动态更改。本文将介绍如何在SpringBoot中实现动态定时任务。 为了实现动态定时任务,我们需要引入相关的依赖。在项目中添加`spring-boot-starter-web`和`spring-boot-starter-validation`是为了支持Web功能和数据校验,而`spring-boot-starter-log4j2`用于日志管理。Lombok库(`lombok`)则简化了对象属性的getter和setter等代码。 在启动类(`DemoApplication`)中,我们需要添加`@EnableScheduling`注解,这会启用Spring的定时任务调度器,使得我们可以定义自己的定时任务。 配置文件`application.yml`中,我们可以设置服务器端口,这里设置为8089。 此外,我们还需要一个配置文件`task-config.ini`来存储定时任务的cron表达式。例如,`printTime.cron=0/10 * * * * ?`表示每10秒执行一次任务。 接下来,我们需要创建一个定时任务执行类。这个类需要实现`SchedulingConfigurer`接口,这样我们可以在运行时动态配置触发器。下面是一个简单的示例: ```java package com.wl.demo.task; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.TriggerContext; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; @Configuration @Data @Slf4j @PropertySource("classpath:task-config.ini") public class DynamicTaskConfig implements SchedulingConfigurer { @Value("${printTime.cron}") private String cronExpression; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask( () -> log.info("任务执行"), triggerContext -> new CronTrigger(cronExpression).nextExecutionTime(triggerContext) ); } } ``` 在这个例子中,`DynamicTaskConfig`类通过`@PropertySource`注解读取`task-config.ini`文件中的`printTime.cron`值,然后在`configureTasks`方法中,我们添加了一个触发任务,该任务的执行逻辑是打印一条日志,并且其触发器是基于我们从配置文件中获取的cron表达式的。 这样,我们就实现了动态定时任务。在运行时,如果我们想要改变任务的执行时间,只需要更新`task-config.ini`文件中的cron表达式,无需重启应用,任务的执行时间就会自动更新。 总结一下,SpringBoot中实现动态定时任务的关键在于: 1. 引入必要的依赖。 2. 启用定时任务调度器`@EnableScheduling`。 3. 创建一个实现`SchedulingConfigurer`接口的配置类,动态读取并应用cron表达式。 4. 使用`@Value`注解从配置文件中获取cron表达式。 5. 在`configureTasks`方法中添加触发任务,使用`CronTrigger`根据新的cron表达式创建触发器。 通过这种方式,我们能够灵活地控制SpringBoot应用中的定时任务执行,满足了业务场景中的动态调整需求。