Правильно, так что ... это не расписание.Это недетерминированное событие.
Запланированное событие - это то, что повторяется и может быть последовательно запущено в определенное время.Существует порядок и предсказуемость, которые идут рука об руку с этим.
Если уволить работу в определенный час, но не обязательно в данную минуту, вы теряете предсказуемость, котораячто будет применять аннотация @Scheduled
(не обязательно посредством реализации, но как побочный эффект; аннотации могут содержать только константы времени компиляции и не могут динамически изменяться во время выполнения).
Что касается решения, Thread.sleep
является хрупким и приведет к тому, что ваше все приложение перейдет в спящий режим на тот период времени, который не , что вы хотите сделать.Вместо этого вы можете заключить критический код в неблокирующий поток и запланировать это вместо этого.
Предупреждение: непроверенный код ниже
@Scheduled(cron = "0 0 * * * ?")
public void executeStrangely() {
// Based on the schedule above,
// all schedule finalization should happen at minute 0.
// If the pool tries to execute at minute 0, there *might* be
// a race condition with the actual thread running this block.
// We do *not* include minute 0 for this reason.
Random random = new Random();
final int actualMinuteOfExecution = 1 + random.nextInt(59);
final ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
exec.schedule(() -> {
// Critical code here
}, actualMinuteOfExecution, TimeUnit.MINUTES);
}
Я оставляю работу по управлению ресурсами в поточно-ориентированном виде как упражнение для читателя.