@ Запланированная аннотация весной

@ Запланированная аннотация весной

1. обзор

В этой статье мы обсудимthe Spring @Scheduled annotation - мы покажем, как его можно использовать для настройки и планирования задач.

Простые правила, которые необходимо соблюдать, чтобы аннотировать метод с помощью@Scheduled:

  • метод должен иметь тип возврата void

  • метод не должен принимать никаких параметров

Дальнейшее чтение:

Как сделать @Async весной

Как включить и использовать @Async в Spring - от очень простого конфигурирования и базового использования до более сложных исполнителей и стратегий обработки исключений.

Read more

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

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

Read more

Планирование весной с кварцем

Краткое введение в работу с Quartz in Spring.

Read more

2. Включить поддержку планирования

Чтобы включить поддержку планирования задач и аннотации@Scheduled в Spring, мы можем использовать аннотацию в стиле Java enable:

@Configuration
@EnableScheduling
public class SpringConfig {
    ...
}

Или мы можем сделать то же самое в XML:

3. Запланировать задачу с фиксированной задержкой

Начнем с настройки задачи для запуска после фиксированной задержки:

@Scheduled(fixedDelay = 1000)
public void scheduleFixedDelayTask() {
    System.out.println(
      "Fixed delay task - " + System.currentTimeMillis() / 1000);
}

В этом случае продолжительность между окончанием последнего выполнения и началом следующего выполнения является фиксированной. Задача всегда ждет, пока предыдущая не будет закончена.

Эту опцию следует использовать, если обязательно выполнить предыдущее выполнение перед повторным запуском.

4. Запланировать задачу по фиксированной ставке

Теперь давайте выполним задачу через фиксированный промежуток времени:

@Scheduled(fixedRate = 1000)
public void scheduleFixedRateTask() {
    System.out.println(
      "Fixed rate task - " + System.currentTimeMillis() / 1000);
}

Эту опцию следует использовать, когда каждое выполнение задачи является независимым.

Обратите внимание, что по умолчанию запланированные задачи не выполняются параллельно. Таким образом, даже если мы использовалиfixedRate, следующая задача не будет вызвана, пока не будет выполнена предыдущая.

Если мы хотим поддерживать параллельное поведение в запланированных задачах, нам нужно добавить аннотацию@Async:

@EnableAsync
public class ScheduledFixedRateExample {
    @Async
    @Scheduled(fixedRate = 1000)
    public void scheduleFixedRateTaskAsync() throws InterruptedException {
        System.out.println(
          "Fixed rate task async - " + System.currentTimeMillis() / 1000);
        Thread.sleep(2000);
    }

}

Теперь эта асинхронная задача будет вызываться каждую секунду, даже если предыдущая задача не выполнена.

5. Фиксированная ставка против фиксированной задержки

Мы можем запустить запланированную задачу, используя аннотацию Spring@Scheduled, но в зависимости от свойствfixedDelay иfixedRate характер выполнения изменяется.

СвойствоfixedDelay гарантирует, что существует задержка вn миллисекунды между временем завершения выполнения задачи и временем начала следующего выполнения задачи.

Это свойство особенно полезно, когда нам нужно убедиться, что только один экземпляр задачи выполняется постоянно. Для зависимых работ это весьма полезно.

The fixedRate property runs the scheduled task at every n millisecond. Он не проверяет выполнение задачи ранее.

Это полезно, когда все выполнения задачи независимы. Если мы не ожидаем превышения размера памяти и пула потоков,fixedRate должен быть весьма кстати.

Но если входящие задачи не завершаются быстро, возможно, они заканчиваются «исключением нехватки памяти».

6. Запланировать задачу с начальной задержкой

Далее - давайте запланируем задачу с задержкой (в миллисекундах):

@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void scheduleFixedRateWithInitialDelayTask() {

    long now = System.currentTimeMillis() / 1000;
    System.out.println(
      "Fixed rate task with one second initial delay - " + now);
}

Обратите внимание, как в этом примере мы используем какfixedDelay, так иinitialDelay. Задача будет выполнена в первый раз после значенияinitialDelay - и продолжит выполняться в соответствии сfixedDelay.

Эта опция удобна, когда у задачи есть настройка, которую необходимо выполнить.

7. Планирование задачи с помощью выражений Cron

Иногда задержек и скоростей недостаточно, и нам нужна гибкость выражения cron для управления расписанием наших задач:

@Scheduled(cron = "0 15 10 15 * ?")
public void scheduleTaskUsingCronExpression() {

    long now = System.currentTimeMillis() / 1000;
    System.out.println(
      "schedule tasks using cron jobs - " + now);
}

Обратите внимание: в этом примере мы планируем выполнение задачи в 10:15 15-го числа каждого месяца.

8. Параметризация расписания

Жесткое программирование этих расписаний является простым, но обычно вам нужно иметь возможность контролировать расписание, не перекомпилируя и не развертывая все приложение.

Мы будем использовать Spring Expressions для экстернализации конфигурации задач - и сохраним их в файлах свойств:

ЗадачаfixedDelay:

@Scheduled(fixedDelayString = "${fixedDelay.in.milliseconds}")

ЗадачаfixedRate:

@Scheduled(fixedRateString = "${fixedRate.in.milliseconds}")

Задача на основе выраженияcron:

@Scheduled(cron = "${cron.expression}")

9. Настройка запланированных задач с помощью XML

Spring также предоставляет XML-способ настройки запланированных задач - вот XML-конфигурация для их настройки:






    
    
    

10. Заключение

В этой статье мы разобрались, как добраться доconfigure and use the @Scheduled annotation.

Мы рассмотрели процесс включения планирования и различные способы настройки шаблонов задач планирования.

Показанные примеры можно найтиover on GitHub.