Рубрики
Без рубрики

Руководство по весеннему планировщику задач

Краткое и практическое руководство по планированию весной с помощью Task Scheduler

Автор оригинала: baeldung.

1. Обзор

В этой статье мы обсудим механизмы планирования задач SpringTaskScheduler и его готовые реализации вместе с различными триггерами для использования. Если вы хотите узнать больше о планировании весной, проверьте статьи @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 .