[] - 2022-09-25 SpringBoot 设置动态定时任务,千万别再写死了~.pdf
需积分: 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应用中的定时任务执行,满足了业务场景中的动态调整需求。