Vodič za proljetni raspored zadataka

1. Pregled

U ovom ćemo članku razgovarati o Proljetni mehanizmi rasporeda zadatakaPlaner zadataka i to su unaprijed izgrađene implementacije, zajedno s različitim okidačima za upotrebu. Ako želite pročitati više o zakazivanju u proljeće, provjerite @Async i @ Na rasporedu članaka.

TaskScheuler je predstavljen u proljeće 3.0 s različitim metodama koje će se pokrenuti u nekom trenutku u budućnosti, a također vraća objekt predstavljanja ScheduledFuture sučelje koje se može koristiti za otkazivanje zakazanog zadatka ili provjeru je li to učinjeno ili nije.

Sve što trebamo učiniti je odabrati zadatak koji se može pokrenuti za raspoređivanje, a zatim odabrati odgovarajuću politiku rasporeda.

2. ThreadPoolTaskScheduler

ThreadPoolTaskScheduler je vrlo pogodan za interno upravljanje nitima, jer delegira zadatke na ScheduledExecutorService i provodi Izvršitelj zadatka sučelje - tako da jedna njegova instanca može obraditi asinkrone potencijalne egzekucije kao i @ Na rasporedu bilješka.

Ajmo sada definirati ThreadPoolTaskScheduler grah na ThreadPoolTaskSchedulerConfig:

@Configuration @ComponentScan (basePackages = "com.baeldung.taskscheduler" basePackageClasses = {ThreadPoolTaskSchedulerExamples.class}) public class ThreadPoolTaskSchedulerConfig {@Bean javni ThreadPoolTaskScheduler threadPoolTaskScheduler () {ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler (); threadPoolTaskScheduler.setPoolSize (5); threadPoolTaskScheduler.setThreadNamePrefix ("ThreadPoolTaskScheduler"); vratiti threadPoolTaskScheduler; }}

Konfigurirani grah threadPoolTaskScheduler može izvršavati zadatke asinkrono na temelju konfigurirane veličine spremišta od 5.

Imajte na umu da svi ThreadPoolTaskScheduler srodna imena niti bit će s prefiksom ThreadPoolTaskScheduler.

Izvršimo jednostavan zadatak koji tada možemo zakazati:

klasa RunnableTask implementira Runnable {private String message; public RunnableTask (String message) {this.message = message; } @Override public void run () {System.out.println (novi datum () + "Zadatak koji se može izvoditi s" + porukom + "na niti" + Thread.currentThread (). GetName ()); }} 

Sada možemo jednostavno rasporediti ovaj zadatak koji će izvršiti planer:

taskScheduler.schedule (novi Runnabletask ("Određeno vrijeme, za 3 sekunde od sada"), novi datum (System.currentTimeMillis + 3000)); 

The taskScheduler će zakazati ovaj izvršivi zadatak na poznati datum, točno 3 sekunde nakon trenutnog vremena.

Krenimo sada malo dublje s ThreadPoolTaskScheduler mehanizmi rasporeda.

3. Zakažite izvršni zadatak s fiksnim kašnjenjem

Zakazivanje s fiksnim kašnjenjem može se izvršiti s dva jednostavna mehanizma:

3.1. Zakazivanje nakon fiksnog kašnjenja zadnjeg planiranog izvršenja

Konfigurirajmo zadatak koji će se izvoditi nakon fiksnog kašnjenja od 1000 milisekundi:

taskScheduler.scheduleWithFixedDelay (novi RunnableTask ("Fiksno kašnjenje od 1 sekunde"), 1000);

The RunnableTask uvijek će raditi 1000 milisekundi kasnije između završetka jednog izvršenja i početka sljedećeg.

3.2. Zakazivanje nakon fiksnog kašnjenja određenog datuma

Konfigurirajmo zadatak da se izvršava nakon fiksnog kašnjenja zadanog vremena početka:

taskScheduler.scheduleWithFixedDelay (novi RunnableTask ("Fiksni datum kašnjenja od 1 sekunde"), novi datum (), 1000);

The RunnableTask pozivat će se u određeno vrijeme izvršenja koje uglavnom vrijeme u kojem @PostConstruct metoda započinje i naknadno s kašnjenjem od 1000 milisekundi.

4. Zakazivanje po fiksnoj stopi

Postoje dva jednostavna mehanizma za raspoređivanje izvršivih zadataka po fiksnoj brzini:

4.1. Zakazivanje RunnableTask po fiksnoj stopi

Zakažimo zadatak koji će se izvoditi na fiksna brzina od milisekundi:

taskScheduler.scheduleAtFixedRate (novi RunnableTask ("Fiksna brzina od 2 sekunde"), 2000);

Sljedeći RunnableTask pokrenut će se uvijek nakon 2000 milisekundi bez obzira na status zadnjeg izvršenja koje se možda još uvijek izvodi.

4.2. Zakazivanje RunnableTask po fiksnoj stopi od određenog datuma

taskScheduler.scheduleAtFixedRate (novi RunnableTask ("Fiksna brzina od 2 sekunde"), novi datum (), 3000);

The RunnableTask pokrenut će 3000 milisekundi nakon trenutnog vremena.

5. Zakazivanje sa CronTrigger

CronTrigger koristi se za planiranje zadatka na temelju izraza cron:

CronTrigger cronTrigger = novi CronTrigger ("10 * * * *?"); 

Navedeni okidač može se koristiti za pokretanje zadatka prema određenoj određenoj kadenci ili rasporedu:

taskScheduler.schedule (novi RunnableTask ("Cron Trigger"), cronTrigger);

U ovom slučaju, RunnableTask izvršit će se 10. sekunde svake minute.

6. Zakazivanje sa PeriodicTrigger

Iskoristimo PeriodicTrigger za zakazivanje zadatka pomoću a fiksno kašnjenje od 2000 milisekundi:

PeriodicTrigger periodicTrigger = novi PeriodicTrigger (2000, TimeUnit.MICROSECONDS);

Konfigurirano PeriodicTrigger bean bi se koristio za pokretanje zadatka nakon određenog kašnjenja od 2000 milisekundi.

Sada zakažimo RunnableTask s PeriodicTrigger:

taskScheduler.schedule (novi RunnableTask ("Periodični okidač"), periodicTrigger);

Također možemo konfigurirati PeriodicTrigger da se inicijalizira fiksnom brzinom, a ne fiksnom odgodom, također možemo postaviti početno kašnjenje za prvi planirani zadatak u zadanim milisekundama.

Sve što trebamo učiniti je dodati dva retka koda prije naredbe return u periodicTrigger grah:

periodicTrigger.setFixedRate (true); periodicTrigger.setInitialDelay (1000);

Koristili smo setFixedRate metoda za planiranje zadatka prema fiksnoj stopi, a ne prema fiksnom kašnjenju setInitialDelay metoda koristi se za postavljanje početnog kašnjenja samo za prvi izvršivi zadatak.

7. Zaključak

U ovom kratkom članku ilustrirali smo kako zakazati izvršivi zadatak pomoću proljetne podrške za zadatke.

Izvršavali smo zadatak s fiksnim kašnjenjem, s fiksnom brzinom i prema zadanom okidaču.

I kao i uvijek, kôd je dostupan kao Maven projekt u GitHubu.