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




Итак... это не расписание. Это недетерминированное событие.
Событие Запланированное — это то, что повторяется и может постоянно запускаться в определенное время. Порядок и предсказуемость идут рука об руку с этим.
Запуская задание в заданный час, но не обязательно в заданную минуту, вы теряете предсказуемость, которую обеспечивает аннотация @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);
}
Я оставляю усилия по управлению ресурсами потокобезопасным способом в качестве упражнения для читателя.
Большое спасибо! Хорошее объяснение.
по крайней мере, сколько раз вы должны запускать задание в день и какое должно быть время задержки?