Ответ 1
Вы можете использовать одну из реализаций Spring TaskScheduler. Ниже приведен пример, в котором не требуется слишком много настроек (ConcurrentTaskScheduler, который включает однопоточный запланированный исполнитель).
Самый простой метод - это расписание с именем Runnable. и дата только. Это заставит задачу запускаться один раз после указанное время. Все остальные методы способны планировать задачи запускаются повторно.
Узнайте больше о выполнении задач & планирование
Простой рабочий пример:
private TaskScheduler scheduler;
Runnable exampleRunnable = new Runnable(){
@Override
public void run() {
System.out.println("Works");
}
};
@Async
public void executeTaskT() {
ScheduledExecutorService localExecutor = Executors.newSingleThreadScheduledExecutor();
scheduler = new ConcurrentTaskScheduler(localExecutor);
scheduler.schedule(exampleRunnable,
new Date(1432152000000L));//today at 8 pm UTC - replace it with any timestamp in miliseconds to text
}
...
executeTaskT() //call it somewhere after the spring application has been configured
Примечание:
Чтобы включить поддержку аннотаций @Scheduled и @Async, добавьте @EnableScheduling и @EnableAsync для одного из ваших @Configuration классы
Обновление - отмена запланированного задания
Метод расписания TaskScheduler возвращает ScheduledFuture, которое является отложенным действием, которое может быть отменено.
Таким образом, чтобы отменить его, вам нужно сохранить дескриптор запланированной задачи (то есть сохранить объект возврата ScheduledFuture).
Изменения в приведенном выше коде для отмены задачи:
- Объявите ScheduledFuture вне вашего метода executeTaskT.
private ScheduledFuture scheduledFuture;
- Измените ваш вызов на расписание, чтобы сохранить возвращаемый объект как таковой:
scheduledFuture = scheduler.schedule(exampleRunnable,
new Date(1432152000000L));
- Вызовите отменить для объекта запланированного будущего где-нибудь в вашем коде
boolean mayInterruptIfRunning = true;
scheduledFuture.cancel(mayInterruptIfRunning);