Руководство по планировщику задач Spring
1. обзор
В этой статье мы обсудимSpring task scheduling mechanisms -TaskScheduler и его предварительно созданные реализации, а также различные триггеры, которые можно использовать. Если вы хотите узнать больше о планировании в Spring, посмотрите статьи@Async и@Scheduled.
TaskScheuler был представлен в Spring 3.0 с множеством методов для запуска в какой-то момент в будущем, он также возвращает объект представления интерфейсаScheduledFuture, который можно использовать для отмены запланированной задачи или проверки того, сделано или нет.
Все, что нам нужно сделать, это выбрать работоспособную задачу для планирования, а затем выбрать правильную политику планирования.
2. ThreadPoolTaskSchedulerс
ThreadPoolTaskScheduler ** хорошо подходит для управления внутренними потоками, поскольку он делегирует задачиScheduledExecutorService и реализует интерфейсTaskExecutor, так что один его экземпляр может обрабатывать асинхронные потенциальные исполнения, а также аннотацию@Scheduled.
Теперь давайте определим bean-компонентThreadPoolTaskScheduler вThreadPoolTaskSchedulerConfig: __
@Configuration
@ComponentScan(
basePackages="org.example.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)
);
taskScheduler запланирует эту запускаемую задачу на известную дату, ровно через 3 секунды после текущего времени.
Теперь давайте подробнее рассмотрим механизмы планированияThreadPoolTaskScheduler.
3. Запланировать задачуRunnable с фиксированной задержкой
Планирование с фиксированной задержкой может быть выполнено с помощью двух простых механизмов:
3.1. Планирование после фиксированной задержки последнего запланированного выполнения
Давайте настроим задачу для запуска после фиксированной задержки в 1000 миллисекунд:
taskScheduler.scheduleWithFixedDelay(
new RunnableTask("Fixed 1 second Delay"), 1000);
RunnableTask всегда будет выполняться через 1000 миллисекунд между завершением одного выполнения и началом следующего.
3.2. Планирование после фиксированной задержки определенной даты
Давайте настроим задачу для запуска после фиксированной задержки заданного времени запуска:
taskScheduler.scheduleWithFixedDelay(
new RunnableTask("Current Date Fixed 1 second Delay"),
new Date(),
1000);
RunnableTask будет вызываться в указанное время выполнения, в основном время, в которое запускается метод@PostConstruct, а затем с задержкой ** 1000 миллисекунд.
4. Планирование с фиксированной ставкой
Существует два простых механизма планирования выполняемых задач с фиксированной скоростью:
4.1. ПланированиеRunnableTask с фиксированной ставкой
Давайте запланируем запуск задачи наfixed rate of milliseconds:
taskScheduler.scheduleAtFixedRate(
new RunnableTask("Fixed Rate of 2 seconds") , 2000);
СледующийRunnableTask будет выполняться всегда через 2000 миллисекунд, независимо от статуса последнего выполнения, которое может все еще выполняться.
4.2. ПланированиеRunnableTask по фиксированной ставке с заданной даты
taskScheduler.scheduleAtFixedRate(new RunnableTask(
"Fixed Rate of 2 seconds"), new Date(), 3000);
RunnableTask будет работать через 3000 миллисекунд после текущего времени.
5. Планирование сCronTrigger
CronTrigger используется для планирования задачи на основе выражения cron:
CronTrigger cronTrigger
= new CronTrigger("10 * * * * ?");
Предоставленный триггер можно использовать для запуска задачи в соответствии с определенной заданной частотой или расписанием:
taskScheduler.schedule(new RunnableTask("Cron Trigger"), cronTrigger);
В этом случаеRunnableTask будет выполняться на 10-й секунде каждой минуты.
6. Планирование сPeriodicTrigger
Давайте используемPeriodicTrigger для планирования задачи сfixed delay равным 2000 миллисекунд:
PeriodicTrigger periodicTrigger
= new PeriodicTrigger(2000, TimeUnit.MICROSECONDS);
Сконфигурированный компонентPeriodicTrigger будет использоваться для запуска задачи после фиксированной задержки ** 2000 миллисекунд.
Теперь давайте запланируемRunnableTask сPeriodicTrigger:
taskScheduler.schedule(
new RunnableTask("Periodic Trigger"), periodicTrigger);
Мы также можем настроитьPeriodicTrigger для инициализации с фиксированной скоростью, а не с фиксированной задержкой, также мы можем установить начальную задержку для первой запланированной задачи на заданные миллисекунды.
Все, что нам нужно сделать, это добавить две строки кода перед оператором возврата в bean-компонентperiodicTrigger:
periodicTrigger.setFixedRate(true);
periodicTrigger.setInitialDelay(1000);
Мы использовали методsetFixedRate для планирования задачи с фиксированной скоростью, а не с фиксированной задержкой, затем методsetInitialDelay используется для установки начальной задержки только для первой запускаемой задачи.
7. Заключение
В этой быстрой статье мы показали, как запланировать выполнение задачи с помощью поддержки Spring для задач.
Мы рассмотрели выполнение задачи с фиксированной задержкой, с фиксированной скоростью и в соответствии с указанным триггером.
И, как всегда, код доступен как проект Mavenover in GitHub.