Можно ли запланировать запуск задания с аннотацией Spring @Scheduled каждый час, но каждый раз в произвольный час? - PullRequest
0 голосов
/ 15 апреля 2019

Я хотел бы запускать свою задачу / метод каждый час ... но каждый раз в произвольную минуту. Я уже пробовал Spring @Scheduled запускаться каждый день в произвольную минуту между 4:00 и 4:30 AM , но это решение устанавливает случайное начальное значение, но после использования этой же минуты.

Я бы хотел добиться ситуации, когда работа будет выполняться следующим образом. например:

8: 10 9:41 10:12 ...

1 Ответ

2 голосов
/ 16 апреля 2019

Правильно, так что ... это не расписание.Это недетерминированное событие.

Запланированное событие - это то, что повторяется и может быть последовательно запущено в определенное время.Существует порядок и предсказуемость, которые идут рука об руку с этим.

Если уволить работу в определенный час, но не обязательно в данную минуту, вы теряете предсказуемость, котораячто будет применять аннотация @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);
}

Я оставляю работу по управлению ресурсами в поточно-ориентированном виде как упражнение для читателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...