实现SpringBoot Schedule不同环境下的开关和执行频率配置

791 阅读2分钟

在实际的项目开发中, 我们经常会用到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. 创建一个类用于管理是否开启调度

我们希望做到定时任务在测试环境不执行, 在线上环境执行.

  1. 我们会使用到以下两个注解:
  • EnableScheduling (启动SpringBoot调度)
  • @ConditionalOnProperty (关于@ConditionalOnProperty的描述可以参考: juejin.cn/spost/72415…)
  1. 新建一个配置类SchedulingConfiguration
@Configuration
@EnableScheduling
@ConditionalOnProperty(prefix = "schedule", name = "enabled", havingValue = "true", matchIfMissing = true)
public class SchedulingConfiguration {

}
  1. 在测试环境的配置application.yml中增加如下配置:
schedule:
  enabled: false
  1. 在线上环境的配置文件applicaion.yml中增加如下配置:
schedule:
  enabled: true

这样配置完, 就实现了定时任务在测试环境不执行, 在线上环境执行的功能.

二: 设置不同环境下不同的执行频率

我们希望做到, 在测试环境下, 1分钟执行一次, 线上环境1小时执行一次, 如果不配置, 默认10分钟执行一次.

  1. 首先对上面的定时任务执行频率做调整
// before
@Scheduled(cron = "0 0/10 * * * ?")

//after
@Scheduled(cron = "${cron.syncData:0 0/10 * * * ?}")
  1. 在测试环境的application.yml中增加如下配置:
cron:
  syncData: 0 0/1 * * * ?
  1. 在线上环境的application.yml中增加如下配置:
cron:
  syncData: 0 0 0/1 * * ? 

这样在不同的配置文件配置完, 定时任务在不同的环境下就会使用不同的执行频率去执行了. 如果不做配置, 将使用cron = "${cron.syncData:0 0/10 * * * ?}" 中冒号后的默认的0 0/10 * * * ? cron表达式去执行.

总结

通过以上内容, 我们就实现了SpringBoot定时任务启用和周期的配置. 在我们的工作中, 这样配置也让我们更好的使用了定时任务这个模块, 更加方便和可定制化.

希望能帮助到大家✌🏻