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.