在实际的项目开发中, 我们经常会用到Spring的Schedule功能来实现一些定时任务. 比如定时同步数据, 刷新数据, 更新数据等等.
但是在各个环境中(开发环境/测试环境/线上环境), 我们又希望对定时任务做不同的配置.例如开发环境所有的定时任务都不执行, 测试环境定时任务频率高一些.
本文我将介绍如何让SpringBoot Schedule在不同的环境下设置是否启用, 并设置任务在不同环境下的执行频率.
一. SpringBoot Schedule的统一开关
1. 例如我们现在有一个同步数据的定时任务, 执行频率为十分钟
@Slf4j
@Service
public class SyncDataSchedule {
@Scheduled(cron = "0 0/10 * * * ?")
public void syncData() {
log.info("SyncData schedule execute")
// Do Something
log.info("SyncData schedule finish")
}
}
2. 创建一个类用于管理是否开启调度
我们希望做到定时任务在测试环境不执行, 在线上环境执行.
- 我们会使用到以下两个注解:
- EnableScheduling (启动SpringBoot调度)
- @ConditionalOnProperty (关于@ConditionalOnProperty的描述可以参考: juejin.cn/spost/72415…)
- 新建一个配置类SchedulingConfiguration
@Configuration
@EnableScheduling
@ConditionalOnProperty(prefix = "schedule", name = "enabled", havingValue = "true", matchIfMissing = true)
public class SchedulingConfiguration {
}
- 在测试环境的配置application.yml中增加如下配置:
schedule:
enabled: false
- 在线上环境的配置文件applicaion.yml中增加如下配置:
schedule:
enabled: true
这样配置完, 就实现了定时任务在测试环境不执行, 在线上环境执行的功能.
二: 设置不同环境下不同的执行频率
我们希望做到, 在测试环境下, 1分钟执行一次, 线上环境1小时执行一次, 如果不配置, 默认10分钟执行一次.
- 首先对上面的定时任务执行频率做调整
// before
@Scheduled(cron = "0 0/10 * * * ?")
//after
@Scheduled(cron = "${cron.syncData:0 0/10 * * * ?}")
- 在测试环境的application.yml中增加如下配置:
cron:
syncData: 0 0/1 * * * ?
- 在线上环境的application.yml中增加如下配置:
cron:
syncData: 0 0 0/1 * * ?
这样在不同的配置文件配置完, 定时任务在不同的环境下就会使用不同的执行频率去执行了. 如果不做配置, 将使用cron = "${cron.syncData:0 0/10 * * * ?}" 中冒号后的默认的0 0/10 * * * ? cron表达式去执行.
总结
通过以上内容, 我们就实现了SpringBoot定时任务启用和周期的配置. 在我们的工作中, 这样配置也让我们更好的使用了定时任务这个模块, 更加方便和可定制化.
希望能帮助到大家✌🏻