1. Обзор
В этой статье мы обсудим механизмы планирования задач Spring – TaskScheduler и его готовые реализации вместе с различными триггерами для использования. Если вы хотите узнать больше о планировании весной, проверьте статьи @Async и @Scheduled .
TaskScheuler был представлен в Spring 3.0 с различными методами для запуска в какой-то момент в будущем, он также возвращает объект представления интерфейса ScheduledFuture , который может быть использован для отмены запланированной задачи или проверки того, выполнена она или нет.
Все, что нам нужно сделать, это выбрать выполняемую задачу для планирования, а затем выбрать правильную политику планирования.
2. ThreadPoolTaskScheduler
ThreadPoolTaskScheduler хорошо подходит для внутреннего управления потоками, поскольку делегирует задачи ScheduledExecutorService и реализует интерфейс TaskExecutor , так что один его экземпляр способен обрабатывать асинхронные потенциальные выполнения, а также аннотацию @Scheduled .
Давайте теперь определим ThreadPoolTaskScheduler bean at ThreadPoolTaskScheduler Config :
@Configuration @ComponentScan( basePackages="com.baeldung.taskscheduler", basePackageClasses={ThreadPoolTaskSchedulerExamples.class}) public class ThreadPoolTaskSchedulerConfig { @Bean public ThreadPoolTaskScheduler threadPoolTaskScheduler(){ ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setPoolSize(5); threadPoolTaskScheduler.setThreadNamePrefix( "ThreadPoolTaskScheduler"); return threadPoolTaskScheduler; } }
Сконфигурированный bean ThreadPoolTaskScheduler может выполнять задачи асинхронно на основе настроенного размера пула 5.
Обратите внимание, что все имена связанных потоков ThreadPoolTaskScheduler будут иметь префикс ThreadPoolTaskScheduler .
Давайте выполним простую задачу, которую мы можем затем запланировать:
class RunnableTask implements Runnable{ private String message; public RunnableTask(String message){ this.message = message; } @Override public void run() { System.out.println(new Date()+" Runnable Task with "+message +" on thread "+Thread.currentThread().getName()); } }
Теперь мы можем просто запланировать выполнение этой задачи планировщиком:
taskScheduler.schedule( new Runnabletask("Specific time, 3 Seconds from now"), new Date(System.currentTimeMillis + 3000) );
Планировщик task Scheduler запланирует выполнение этой задачи на известную дату, ровно через 3 секунды после текущего времени.
Теперь давайте немного углубимся в механизмы планирования ThreadPoolTaskScheduler .
3. Запланируйте Выполнение Задачи С Фиксированной Задержкой
Планирование с фиксированной задержкой может быть выполнено с помощью двух простых механизмов:
3.1. Планирование После Фиксированной задержки Последнего Запланированного выполнения
Давайте настроим задачу на запуск с фиксированной задержкой в 1000 миллисекунд:
taskScheduler.scheduleWithFixedDelay( new RunnableTask("Fixed 1 second Delay"), 1000);
Выполняемая задача всегда будет выполняться через 1000 миллисекунд между завершением одного выполнения и началом следующего.
3.2. Планирование После Фиксированной задержки определенной даты
Давайте настроим задачу на запуск после фиксированной задержки заданного времени запуска:
taskScheduler.scheduleWithFixedDelay( new RunnableTask("Current Date Fixed 1 second Delay"), new Date(), 1000);
Выполняемая задача будет вызвана в указанное время выполнения, которое в основном является временем запуска метода @PostConstruct , а затем с задержкой в 1000 миллисекунд.
4. Планирование по фиксированной ставке
Существует два простых механизма планирования выполняемых задач с фиксированной скоростью:
4.1. Планирование выполняемой задачи с фиксированной скоростью
Давайте запланируем выполнение задачи с фиксированной скоростью в миллисекундах.:
taskScheduler.scheduleAtFixedRate( new RunnableTask("Fixed Rate of 2 seconds") , 2000);
Следующий Выполняемая Задача будет выполняться всегда после 2000 миллисекунд независимо от состояния последнего выполнения, которое может быть все еще запущено.
4.2. Планирование Выполняемой задачи по Фиксированной ставке С Заданной Даты
taskScheduler.scheduleAtFixedRate(new RunnableTask( "Fixed Rate of 2 seconds"), new Date(), 3000);
Выполняемая задача будет выполняться через 3000 миллисекунд после текущего времени.
5. Планирование с помощью CronTrigger
CronTrigger используется для планирования задачи на основе выражения cron:
CronTrigger cronTrigger = new CronTrigger("10 * * * * ?");
Предоставленный триггер может быть использован для запуска задачи в соответствии с определенной заданной каденцией или расписанием:
taskScheduler.schedule(new RunnableTask("Cron Trigger"), cronTrigger);
В этом случае Выполняемая задача будет выполняться на 10-й секунде каждой минуты.
6. Планирование с периодическим триггером
Давайте использовать Периодический триггер для планирования задачи с фиксированной задержкой 2000 миллисекунд:
PeriodicTrigger periodicTrigger = new PeriodicTrigger(2000, TimeUnit.MICROSECONDS);
Настроенный Периодический триггер bean будет использоваться для запуска задачи после фиксированной задержки в 2000 миллисекунд.
Теперь давайте запланируем Запускаемую задачу с помощью Периодического триггера :
taskScheduler.schedule( new RunnableTask("Periodic Trigger"), periodicTrigger);
Мы также можем настроить Периодический триггер для инициализации с фиксированной скоростью, а не с фиксированной задержкой, также мы можем установить начальную задержку для первой запланированной задачи на заданные миллисекунды.
Все, что нам нужно сделать, это добавить две строки кода перед оператором return в periodic Trigger bean :
periodicTrigger.setFixedRate(true); periodicTrigger.setInitialDelay(1000);
Мы использовали метод set Fixed Rate для планирования задачи с фиксированной скоростью, а не с фиксированной задержкой, затем метод setInitialDelay используется для установки начальной задержки только для первой выполняемой задачи.
7. Заключение
В этой краткой статье мы проиллюстрировали, как запланировать запускаемую задачу с помощью поддержки Spring для задач.
Мы рассматривали выполнение задачи с фиксированной задержкой, с фиксированной скоростью и в соответствии с заданным триггером.
И, как всегда, код доступен в виде проекта Maven на GitHub .