Útmutató a tavaszi feladatütemezőhöz

1. Áttekintés

Ebben a cikkben megvitatjuk a Tavaszi feladatütemezési mechanizmusokFeladat ütemező és előre elkészített megvalósításai, valamint a különböző kiváltó tényezők. Ha többet szeretne tudni a tavaszi ütemezésről, ellenőrizze @Aszinkron és @Ütemezett cikkeket.

TaskScheuler 3.0 tavaszán vezették be különféle módszerekkel, amelyek a jövőben egy bizonyos ponton futtathatók, és visszaadja a ScheduledFuture felület, amely felhasználható az ütemezett feladat törlésére vagy annak elvégzésére.

Mindössze annyit kell tennünk, hogy kiválasztunk egy futtatható feladatot az ütemezéshez, majd kiválasztunk egy megfelelő ütemezési házirendet.

2. ThreadPoolTaskScheduler

ThreadPoolTaskScheduler kiválóan alkalmas belső szálak kezelésére, mivel feladatokat delegál a ScheduledExecutorService és végrehajtja a TaskExecutor interfész - így egyetlen példánya képes kezelni az aszinkron potenciális végrehajtásokat, valamint a @Ütemezett annotáció.

Most határozzuk meg ThreadPoolTaskScheduler bab itt ThreadPoolTaskSchedulerConfig:

@Configuration @ComponentScan (basePackages = "com.baeldung.taskscheduler", basePackageClasses = {ThreadPoolTaskSchedulerExamples.class}) public class ThreadPoolTaskSchedulerConfig {@Bean public ThreadPoolTaskSchulSchulSchulToolSchulToolSchulToolPaskTaskSchulToolSchulToolPaskToolSchulToolSchulToolSoolToolSchulToolSoolToolSchulToolSoolToolSchulToolPaskToolSoolPaskTulcsSulka (Eredeti) ThulPoolTaskSchulter (IskolaPaskSchulter) {@Bean public ThreadPoolTaskSulchulter {Cím] threadPoolTaskScheduler.setPoolSize (5); threadPoolTaskScheduler.setThreadNamePrefix ("ThreadPoolTaskScheduler"); return threadPoolTaskScheduler; }}

A konfigurált bab threadPoolTaskScheduler aszinkron módon tudja végrehajtani a feladatokat a beállított 5-ös készlet méret alapján.

Vegye figyelembe, hogy minden ThreadPoolTaskScheduler a kapcsolódó szálnevek előtaggal lesznek ThreadPoolTaskScheduler.

Végezzünk el egy egyszerű feladatot, amelyet aztán ütemezhetünk:

osztály RunnableTask megvalósítja Runnable {private String üzenetet; public RunnableTask (String üzenet) {this.message = üzenet; } @Orride public void run () {System.out.println (new Date () + "Futtatható feladat" + üzenettel + "a szálon" + Thread.currentThread (). GetName ()); }} 

Most már egyszerűen ütemezhetjük, hogy ezt a feladatot az ütemező hajtsa végre:

taskScheduler.schedule (új Runnabletask ("Meghatározott idő, 3 másodperc múlva"), új Dátum (System.currentTimeMillis + 3000)); 

A feladat ütemező ütemezi ezt a futható feladatot egy ismert időpontra, pontosan 3 másodperccel az aktuális idő után.

Menjünk most egy kicsit részletesebben a ThreadPoolTaskScheduler ütemezési mechanizmusok.

3. Futtatható feladat ütemezése fix késéssel

A fix késleltetéssel történő ütemezés két egyszerű mechanizmussal hajtható végre:

3.1. Ütemezés az utolsó ütemezett végrehajtás fix késése után

Konfiguráljunk egy feladatot 1000 milliszekundumos fix késés után történő futtatásra:

taskScheduler.scheduleWithFixedDelay (új RunnableTask ("Fix 1 másodperces késés"), 1000);

A RunnableTask mindig 1000 milliszekundummal később fog futni az egyik végrehajtás befejezése és a következő kezdete között.

3.2. Ütemezés egy adott dátum fix késése után

Konfiguráljuk a feladatot egy adott kezdési idő fix késleltetése után futásra:

taskScheduler.scheduleWithFixedDelay (új RunnableTask ("Az aktuális dátum javítva 1 másodperces késéssel"), új Date (), 1000);

A RunnableTask a megadott végrehajtási időpontban lesz meghívva, amely főleg az az idő, amelyben @PostConstruct a módszer elindul, majd 1000 milliszekundum késéssel.

4. Ütemezés rögzített árfolyamon

Két egyszerű mechanizmus létezik a futható feladatok rögzített ütemű ütemezéséhez:

4.1. A. Ütemezése RunnableTask rögzített árfolyamon

Ütemezzünk egy feladatot egy a rögzített ezredmásodperc:

taskScheduler.scheduleAtFixedRate (új RunnableTask ("2 másodperces rögzített sebesség"), 2000);

A következő RunnableTask 2000 milliszekundum után fog futni, függetlenül az utolsó végrehajtás állapotától, amely esetleg még fut.

4.2. A. Ütemezése RunnableTask rögzített árfolyamon adott dátumtól

taskScheduler.scheduleAtFixedRate (új RunnableTask ("2 másodperces rögzített sebesség"), új Date (), 3000);

A RunnableTask 3000 milliszekundumot fog futni a jelenlegi idő után.

5. Ütemezés a CronTrigger

CronTrigger a feladat cron kifejezés alapján történő ütemezésére szolgál:

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

A megadott trigger aktiválható egy feladat futtatásához egy meghatározott megadott ütem vagy ütemezés szerint:

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

Ebben az esetben a RunnableTask minden perc 10. másodpercében végrehajtják.

6. Ütemezés a PeriodicTrigger

Használjuk PeriodicTrigger a feladat ütemezéséhez a fix késleltetés 2000 ezredmásodperc:

PeriodicTrigger periodicTrigger = új PeriodicTrigger (2000, TimeUnit.MICROSECONDS);

A konfigurált PeriodicTrigger A babot egy feladat futtatására használják, 2000 milliszekundum fix késleltetés után.

Most ütemezzük be a RunnableTask a ... val PeriodicTrigger:

taskScheduler.schedule (új RunnableTask ("Periodic Trigger"), periodicTrigger);

Konfigurálhatunk is PeriodicTrigger rögzített késleltetéssel inicializálni, nem pedig fix késleltetés mellett, az első ütemezett feladat kezdeti késleltetését is beállíthatjuk egy adott milliszekundummal.

Mindössze annyit kell tennünk, hogy hozzáadunk két kódsort a return utasítás elé a periodicTrigger bab:

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

Használtuk a setFixedRate módszer a feladat rögzített ütemben történő ütemezésére, nem pedig fix késéssel setInitialDelay metódus csak az első futandó feladat kezdeti késleltetésének beállítására szolgál.

7. Következtetés

Ebben a gyors cikkben bemutattuk, hogyan lehet ütemezni egy futható feladatot a Spring támogatás segítségével a feladatokhoz.

Megnéztük, hogy a feladatot fix késéssel, rögzített sebességgel és egy meghatározott trigger szerint futtatjuk.

És mint mindig, a kód Maven-projektként is elérhető a GitHubban.