W systemie zdarza się konieczność uruchamiania czynności cyklicznie. Spring Boot dostarcza narzędzia umożliwiające harmonogramowania wykonywanych zadań.
Zadania cykliczne
Aby umożliwić wykonywanie zadań cyklicznych należy w projekcie, w klasie konfiguracyjnej dodać adnotacje @EnableScheduling.
Jeśli chcemy uruchomić daną metodę cyklicznie należy dodać nad nią adnotacje @Scheduled. Adnotacja przyjmuje ona parametry:
- cron – uruchamia zadanie według podanej minuty, godziny, dnia, miesiąca i dnia tygodnia – jego format to:
{@code "0 * * * * MON-FRI"}
- zone – strefa czasowa według której ma zostać uruchomiony cron;
- fixedDelay – interwał określający co jaki czas ma zostać uruchomione zadanie; jako argument przyjmuje wartość typu long;
- fixedDelayString – interwał określający co jaki czas ma zostać uruchomione zadanie; jako argument przyjmuje wartość typu String;
- fixedRate – interwał określający po jakim czasie ma zostać metoda wywołana kolejny raz; jako argument przyjmuje wartość typu long;
- fixedRateString – interwał określający po jakim czasie ma zostać metoda wywołana kolejny raz; jako argument przyjmuje wartość typu String;
- initialDelay – opóźnienie z jakim pierwszy raz ma wywołać się dana metoda; jako argument przyjmuje wartość typu long;
- initialDelayString – opóźnienie z jakim pierwszy raz ma wywołać się dana metoda; jako argument przyjmuje wartość typu String;
Wartości podawane są w milisekundach.
Przykłady
@SpringBootApplication @EnableScheduling public class SpringbootScheduleApplication { public static void main(String[] args) { SpringApplication.run(SpringbootScheduleApplication.class, args); } // execute every 10 seconds @Scheduled(fixedDelay = 10000) public void writeSomething1() { System.out.println("bycza zagroda"); } // execute method every 10 seconds after it is finished @Scheduled(fixedRateString = "10000") public void writeSomething2() { System.out.println("bycza zagroda2"); } // execute every 10 seconds, but first time after 5 seconds @Scheduled(fixedRate = 10000, initialDelay = 5000) public void writeSomething3() { System.out.println("bycza zagroda3"); } // execute At 30 minutes past the hour, between 10:00 AM and 01:59 PM, only on Wednesday and Friday @Scheduled(cron = "0 30 10-13 ? * WED,FRI") public void writeSomething4() { System.out.println("bycza zagroda4"); } }
Harmonogramy
Istnieje możliwość jednej metodzie przypisać wiele wywołań cyklicznych, które zgrupowane tworzą harmonogram. Należy do tego wykorzystać adnotacje @Schedules i w jej argumencie przekazać zadania do wykonania.
// execute At 30 minutes past the hour, between 10:00 AM and 01:59 PM, only on Wednesday and Friday AND every 10 seconds @Schedules({ @Scheduled(cron = "0 30 10-13 ? * WED,FRI"), @Scheduled(fixedDelay = 10000) }) public void writeSomething5() { System.out.println("bycza zagroda5"); }
Warto wiedzieć
Czas, na podstawie którego działają zadania cykliczne jest pobierany i uzależniony od czasu ustawionego na maszynie, która hostuje aplikacje.