Java

Spring Boot #21 – zadania cykliczne i harmonogramy

Spring Boot

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.

Tags:
Show Buttons
Hide Buttons