Spring SchedulingConfigurer 动态延迟
Spring SchedulingConfigurer dynamic delay
我有一个应用应该在每天早上 7 点到晚上 7 点之间执行一次操作。我想随机选择 运行 任务的有效时间,然后为 下一个 任务使用不同的开始时间。
我发现的每个解决方案都会生成一个有效的随机启动 cron,但随后每个 运行 都会生成相同的 cron。我每次都需要一个不同的随机开始。
我试过使用 CronTrigger,但它仍然保持不变。下面是一些示例代码:
@Component
public class ScheduledTasks implements SchedulingConfigurer {
private static final Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(this.taskExecutor());
taskRegistrar.addTriggerTask(
() -> logger.info("The time is {}", dateFormat.format(new Date())),
new CronTrigger(this.randomCron(0, 60)));
}
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(5);
}
private String randomCron(int min, int max) {
return ThreadLocalRandom.current().nextInt(min, max) + " * * * * *";
}
}
我在 Spring 中了解了 Triggers,您可以使用它来安排下一个 运行。我的新代码现在看起来像这样:
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(this.taskExecutor());
taskRegistrar.addTriggerTask(
() -> logger.info("The time is {}", dateFormat.format(new Date())),
(tc) -> {
Date lastCompletion = tc.lastCompletionTime();
if (lastCompletion == null) {
lastCompletion = new Date();
}
Calendar cal = new Calendar.Builder().setInstant(lastCompletion).build();
int second = ThreadLocalRandom.current().nextInt(0, 60);
long minute = 60000L + second * 1000L;
Date nextRun = new Date(cal.getTime().getTime() + minute);
logger.info("Next run will be at {}", nextRun);
logger.info("Time between runs is {}", minute);
return new Date();
});
}
我有一个应用应该在每天早上 7 点到晚上 7 点之间执行一次操作。我想随机选择 运行 任务的有效时间,然后为 下一个 任务使用不同的开始时间。
我发现的每个解决方案都会生成一个有效的随机启动 cron,但随后每个 运行 都会生成相同的 cron。我每次都需要一个不同的随机开始。
我试过使用 CronTrigger,但它仍然保持不变。下面是一些示例代码:
@Component
public class ScheduledTasks implements SchedulingConfigurer {
private static final Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(this.taskExecutor());
taskRegistrar.addTriggerTask(
() -> logger.info("The time is {}", dateFormat.format(new Date())),
new CronTrigger(this.randomCron(0, 60)));
}
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(5);
}
private String randomCron(int min, int max) {
return ThreadLocalRandom.current().nextInt(min, max) + " * * * * *";
}
}
我在 Spring 中了解了 Triggers,您可以使用它来安排下一个 运行。我的新代码现在看起来像这样:
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(this.taskExecutor());
taskRegistrar.addTriggerTask(
() -> logger.info("The time is {}", dateFormat.format(new Date())),
(tc) -> {
Date lastCompletion = tc.lastCompletionTime();
if (lastCompletion == null) {
lastCompletion = new Date();
}
Calendar cal = new Calendar.Builder().setInstant(lastCompletion).build();
int second = ThreadLocalRandom.current().nextInt(0, 60);
long minute = 60000L + second * 1000L;
Date nextRun = new Date(cal.getTime().getTime() + minute);
logger.info("Next run will be at {}", nextRun);
logger.info("Time between runs is {}", minute);
return new Date();
});
}