【问题标题】:Spring @Scheduled to be started every day at a random minute between 4:00AM and 4:30AM春季@计划在每天凌晨 4:00 至凌晨 4:30 之间的随机分钟开始
【发布时间】:2017-04-22 08:03:36
【问题描述】:

如问题标题中所述,我需要设置 Spring Scheduler 以运行方法以将数据库中的某些内容加载到内存中,每天凌晨 4 点左右

问题是我有这个服务器的多个实例,我不希望所有实例同时开始执行,因为它会减慢数据库。所以我希望时间在凌晨 4:00 到凌晨 4:30 之间的某个随机分钟

假设每天凌晨 4:03 开始​​一个实例,凌晨 4:09 开始另一个,凌晨 4:21 开始第三个,以此类推。查询的执行持续 1 分钟。

这是否可能与 cron 表达式有关,但不使用 $RANDOM bash(因为我认为我没有它),或者我需要以其他方式将此随机值注入

@Scheduled(cron="* randomMinuteValue 4 * * *")

【问题讨论】:

  • 我不会这样做。为什么不同时启动它们并根据数据库连接池中正在使用的连接数来限制它们。
  • 我写的错误我有多个服务实例,但我想说的是服务器实例,因此每个服务器都会尝试同时连接到数据库。而且我无法控制另一个服务器实例来限制它们。对不起我写的错误:(@EssexBoy
  • 你用的是什么数据库?
  • @EssexBoy mysql
  • 我想我找到了一种使用 RandomValuePropertySource 的方法,我可以为给定范围注入任何随机 int,例如 @Scheduled(cron='0 ${random.int[0,30]} 4 * * ?')

标签: spring cron


【解决方案1】:

使用 Spring 中的 RandomValuePropertySource

@Scheduled(cron="0 ${random.int[0,30]} 4 * * ?")

【讨论】:

  • 注意随机值是在初始化时计算的,每天都会使用相同的时间。它不是完全随机的,但适合 OP 避免活动峰值的问题。
【解决方案2】:

如果你有 java 8 但没有 spring boot,你可以尝试以下方法:

@Scheduled(cron = "0 #{new java.util.Random().nextInt(30)} 4 * * ?")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    相关资源
    最近更新 更多