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

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

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

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

по крайней мере, сколько раз вы должны запускать задание в день и какое должно быть время задержки?

Deadpool 15.04.2019 23:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
632
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак... это не расписание. Это недетерминированное событие.

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

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

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

Большое спасибо! Хорошее объяснение.

kingkong 16.04.2019 01:15

Другие вопросы по теме