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

Руководство по планировщику задач 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.