Plánovanie v Jakarte EE

1. Prehľad

V predchádzajúcom článku sme si ukázali, ako naplánovať úlohy na jar pomocou@Naplánovanýanotácia. V tomto článku si ukážeme, ako dosiahnuť to isté použitím službu časovača v aplikácii Jakarta EE pre každý prípad uvedený v predchádzajúcom článku.

2. Povoľte podporu plánovania

V aplikácii Jakarta EE nie je potrebné povoliť podporu časovaných úloh. Služba časovača je služba spravovaná kontajnerom, ktorá umožňuje aplikáciám volať metódy, ktoré sú naplánované na udalosti založené na čase. Napríklad môže byť potrebné, aby aplikácia spustila niektoré denné prehľady v určitú hodinu, aby mohla generovať štatistiku.

Existujú dva typy časovačov:

  • Programové časovače: službu časovača je možné vložiť do akejkoľvek fazule (okrem stavovej fazule relácie) a obchodná logika by mala byť umiestnená v metóde s poznámkami s @Čas vypršal. Časovač je možné inicializovať anotovanou metódou @PostConstruct fazule alebo sa dá inicializovať iba volaním metódy.
  • Automatické časovače: obchodná logika je umiestnená do akejkoľvek metódy s poznámkou @ Časový plán alebo @ Rozvrhy. Tieto časovače sa inicializujú hneď po spustení aplikácie.

Začnime teda našim prvým príkladom.

3. Naplánujte úlohu s pevným oneskorením

Na jar sa to robí jednoducho pomocou @Scheduled (fixedDelay = 1000) anotácia. V tomto prípade je trvanie medzi koncom poslednej popravy a začiatkom nasledujúcej popravy pevné. Úloha vždy počká, kým sa dokončí predchádzajúca.

Urobiť presne to isté v Jakarte EE je o niečo ťažšie dosiahnuť, pretože nie je k dispozícii žiadny podobný vstavaný mechanizmus, podobný scenár je však možné implementovať s trochou extra kódovania. Pozrime sa, ako sa to deje:

@Singleton verejná trieda FixedTimerBean {@EJB súkromný WorkerBean workerBean; @Lock (LockType.READ) @Schedule (second = "* / 5", minute = "*", hour = "*", persistent = false) public void atSchedule () vyvolá InterruptedException {workerBean.doTimerWork (); }} 
@Singleton verejná trieda WorkerBean {private AtomicBoolean busy = nový AtomicBoolean (false); @Lock (LockType.READ) public void doTimerWork () vyvolá InterruptedException {if (! Busy.compareAndSet (false, true)) {návrat; } skus {Thread.sleep (20000L); } konečne {busy.set (false); }}}

Ako vidíte, časovač je naplánovaný na spustenie každých päť sekúnd. Metóda spustená v našom prípade však simulovala 20-sekundový čas odozvy hovorom spánok () na prúd Závit.

V dôsledku toho bude kontajner naďalej volať doTimerWork () každých päť sekúnd, ale stav uvedený na začiatku metódy, busy.compareAndSet (false, true), sa vráti okamžite, ak sa predchádzajúci hovor nedokončil. Týmto zabezpečíme, že ďalšia úloha bude vykonaná až po dokončení predchádzajúcej úlohy.

4. Naplánujte úlohu na pevnú sadzbu

Jedným zo spôsobov, ako to urobiť, je použiť službu časovača, ktorá je vložená pomocou @ Zdroj a nakonfigurovaný v anotovanej metóde @PostConstruct. Metóda komentovaná @Čas vypršal bude volané, keď vyprší časovač.

Ako bolo uvedené v predchádzajúcom článku, začiatok vykonávania úlohy nečaká na dokončenie predchádzajúceho spustenia. Táto možnosť by sa mala použiť, keď je každé vykonanie úlohy nezávislé. Nasledujúci úryvok kódu vytvára časovač, ktorý sa spúšťa každú sekundu:

@Startup @Singleton verejná trieda ProgrammaticAtFixedRateTimerBean {@Inject Udalosť udalosti; @Resource TimerService timerService; @PostConstruct public void initialize () {timerService.createTimer (0,1000, "Každý druhý časovač bez oneskorenia"); } @Timeout public void programmaticTimout (časovač časovača) {event.fire (nový TimerEvent (timer.getInfo (). ToString ())); }}

Ďalším spôsobom je použitie @Naplánovaný anotácia. V nasledujúcom útržku kódu spúšťame každých päť sekúnd časovač:

@Startup @Singleton verejná trieda ScheduleTimerBean {@Inject Udalosť udalosti; @Schedule (hour = "*", minute = "*", second = "* / 5", info = "časovač každých 5 sekúnd") public void automaticallyScheduled (časovač) {fireEvent (časovač); } private void fireEvent (Časovač časovača) {event.fire (nový TimerEvent (časovač.getInfo (). toString ())); }}

5. Naplánujte úlohu s počiatočným oneskorením

Ak scenár vášho prípadu použitia vyžaduje, aby časovač začal s oneskorením, môžeme to urobiť tiež. V takom prípade Jakarta EE umožňuje použitie časovej služby. Pozrime sa na príklad, keď má časovač počiatočné oneskorenie 10 sekúnd a potom sa spustí každých päť sekúnd:

@Startup @Singleton verejná trieda ProgrammaticWithInitialFixedDelayTimerBean {@Inject Udalosť udalosti; @Resource TimerService timerService; @PostConstruct public void initialize () {timerService.createTimer (10 000, 5 000, „Meškanie 10 sekúnd, potom každých 5 sekúnd časovač“); } @Timeout public void programmaticTimout (časovač časovača) {event.fire (nový TimerEvent (timer.getInfo (). ToString ())); }}

The createTimer metóda použitá v našej vzorke používa nasledujúci podpis createTimer (long initialDuration, long intervalDuration, java.io.Serializable info) kde initialDuration je počet milisekúnd, ktoré musia uplynúť pred prvým oznámením o vypršaní platnosti časovača a intervalDuration je počet milisekúnd, ktoré musia uplynúť medzi upozorneniami na vypršanie platnosti časovača.

V tomto príklade používame znak initialDuration 10 sekúnd a an intervalDuration päť sekúnd. Úloha sa vykoná prvýkrát po initialDuration hodnotu a bude sa naďalej vykonávať podľa intervalDuration.

6. Naplánujte úlohu pomocou výrazov Cron

Všetky plánovače, ktoré sme videli, programové aj automatické, umožňujú použitie výrazov cron. Pozrime sa na príklad:

@Schedules ({@Schedule (dayOfMonth = "Last"), @Schedule (dayOfWeek = "Fri", hour = "23")}) public void doPeriodicCleanup () {...}

V tomto príklade metóda doPeriodicCleanup () sa bude volať každý piatok o 23:00 a posledný deň v mesiaci.

7. Záver

V tomto článku sme sa pozreli na rôzne spôsoby, ako plánovať úlohy v prostredí Jakarty EE ako východiskový bod sa použil predchádzajúci článok, kde sa vzorky robili pomocou jari.

Ukážky kódu nájdete v úložisku GitHub.


$config[zx-auto] not found$config[zx-overlay] not found