@ Планираната анотация през пролетта

1. Общ преглед

В този урок ще илюстрираме как анотацията Spring @Scheduled може да се използва за конфигуриране и планиране на задачи.

Простите правила, които трябва да спазваме, за да анотираме метод с @Scheduled, са:

  • методът трябва да има тип void return
  • методът не трябва да приема никакви параметри

2. Активирайте поддръжка за планиране

За да активираме поддръжка за задачи за планиране и анотацията @Scheduled през пролетта, можем да използваме анотацията в стила за активиране на Java:

@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. Фиксирана скорост срещу фиксирано закъснение

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

В fixedDelay Имотът се увери, че има забавяне на п милисекунда между времето за финала на изпълнение на дадена задача и началния час на следващото изпълнение на задачата.

Това свойство е особено полезно, когато трябва да се уверим, че само един екземпляр на задачата работи непрекъснато. За зависими работни места е много полезно.

В fixedRate имота минава планираната задача на всяко н милисекунда. Не проверява за предишни изпълнения на задачата.

Това е полезно, когато всички изпълнения на задачата са независими. Ако не очакваме да надхвърлим размера на паметта и пула от нишки, 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 Expressions

Понякога закъсненията и тарифите не са достатъчни и се нуждаем от гъвкавостта на 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-ия ден на всеки месец.

По подразбиране Spring ще използва локалната часова зона на сървъра за израза cron. Въпреки това можем да използваме атрибута зона , за да променим тази часова зона :

@Scheduled(cron = "0 15 10 15 * ?", zone = "Europe/Paris")

С тази конфигурация Spring ще насрочи анотирания метод да се изпълнява в 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. Заключение

В тази статия обсъдихме начина за конфигуриране и използване на анотацията @Scheduled .

Ние обхванахме процеса, за да дадем възможност за планиране и различни начини за конфигуриране на шаблони на задачи за планиране.

Примерите, показани по-горе, могат да бъдат намерени в GitHub.