Jarné udalosti

1. Prehľad

V tomto článku budeme diskutovať ako používať udalosti na jar.

Udalosti sú jednou z viac prehliadaných funkcií v rámci, ale aj jednou z užitočnejších. A rovnako ako mnoho iných vecí na jar, aj publikovanie udalostí je jednou z možností, ktoré poskytuje ApplicationContext.

Existuje niekoľko jednoduchých pokynov, ktoré je potrebné dodržať:

  • podujatie by sa malo predĺžiť ApplicationEvent
  • vydavateľ by mal vložiť ApplicationEventPublisher objekt
  • poslucháč by mal implementovať ApplicationListener rozhranie

2. Vlastná udalosť

Jar nám umožňuje vytvárať a publikovať vlastné udalosti, ktoré - štandardne - sú synchrónne. To má niekoľko výhod - napríklad to, že sa poslucháč môže zapojiť do transakčných kontextov vydavateľa.

2.1. Jednoduchá udalosť aplikácie

Poďme vytvárať jednoduchá trieda udalostí - iba zástupný symbol na ukladanie údajov o udalosti. V tomto prípade trieda udalosti obsahuje správu typu String:

verejná trieda CustomSpringEvent rozširuje ApplicationEvent {súkromná reťazcová správa; public CustomSpringEvent (zdroj objektu, reťazcová správa) {super (zdroj); this.message = správa; } public String getMessage () {spätna sprava; }}

2.2. Vydavateľ

Teraz poďme vytvoriť vydavateľ tejto udalosti. Vydavateľ zostaví objekt udalosti a zverejní ho pre každého, kto ho počúva.

Na zverejnenie udalosti môže vydavateľ jednoducho vložiť ApplicationEventPublisher a použite publishEvent () API:

@Component public class CustomSpringEventPublisher {@Autowired private ApplicationEventPublisher applicationEventPublisher; public void publishCustomEvent (konečná reťazcová správa) {System.out.println ("Publikovanie vlastnej udalosti."); CustomSpringEvent customSpringEvent = nový CustomSpringEvent (táto správa); applicationEventPublisher.publishEvent (customSpringEvent); }}

Alternatívne môže trieda vydavateľa implementovať ApplicationEventPublisherAware rozhranie - toto tiež vloží vydavateľa udalosti do spustenia aplikácie. Spravidla je jednoduchšie vydavateľa jednoducho vpichnúť @Autowire.

2.3. Poslucháč

Nakoniec vytvorme poslucháča.

Jedinou požiadavkou pre poslucháča je byť fazuľou a implementovať ApplicationListener rozhranie:

@ Verejná trieda komponentu CustomSpringEventListener implementuje ApplicationListener {@Override public void onApplicationEvent (udalosť CustomSpringEvent) {System.out.println ("Prijatá jarná vlastná udalosť -" + event.getMessage ()); }}

Všimnite si, ako je náš vlastný poslucháč parametrizovaný všeobecným typom vlastných udalostí - čo robí onApplicationEvent () metóda typovo bezpečná. To tiež zabráni tomu, aby ste museli skontrolovať, či je objekt inštanciou konkrétnej triedy udalostí a prenášať ho.

A ako už bolo spomenuté - predvolene jarné udalosti sú synchrónne - the doStuffAndPublishAnEvent () metóda blokuje, kým všetci poslucháči nedokončia spracovanie udalosti.

3. Vytváranie asynchrónnych udalostí

V niektorých prípadoch synchronizované zverejňovanie udalostí nie je to, čo hľadáme - možno budeme potrebovať asynchrónne spracovanie našich udalostí.

Môžete to zapnúť v konfigurácii vytvorením ApplicationEventMulticaster fazuľa s exekútorom; pre naše účely tu SimpleAsyncTaskExecutor funguje to:

@Configuration verejná trieda AsynchronousSpringEventsConfig {@Bean (name = "applicationEventMulticaster") verejná ApplicationEventMulticaster simpleApplicationEventMulticaster () {SimpleApplicationEventMulticaster eventMulticaster = nová SimpleApplicationEventMulticaster (); eventMulticaster.setTaskExecutor (nový SimpleAsyncTaskExecutor ()); návratová udalosťMulticaster; }}

Implementácia udalosti, vydavateľa a poslucháča zostáva rovnaká ako predtým - teraz však, poslucháč bude asynchrónne riešiť udalosť v samostatnom vlákne.

4. Existujúce rámcové udalosti

Samotná jar zverejňuje rôzne udalosti po vybalení z krabice. Napríklad ApplicationContext bude strieľať rôzne rámcové udalosti. Napr. ContextRefreshedEvent, ContextStartedEvent, RequestHandledEvent atď.

Tieto udalosti poskytujú vývojárom aplikácií možnosť zapojiť sa do životného cyklu aplikácie a kontextu a podľa potreby pridať vlastnú logiku.

Tu je rýchly príklad poslucháča, ktorý počúva na obnovenie kontextu:

verejná trieda ContextRefreshedListener implementuje ApplicationListener {@Override public void onApplicationEvent (ContextRefreshedEvent cse) {System.out.println ("Spracovanie kontextovo obnovenej udalosti."); }}

Ak sa chcete dozvedieť viac informácií o existujúcich udalostiach rámca, pozrite si náš ďalší tutoriál tu.

5. Prijímač udalostí riadený anotáciami

Počnúc jarom 4.2 nemusí byť poslucháč udalostí fazuľou implementujúcou program ApplicationListener rozhranie - je možné ho zaregistrovať na ľubovoľnom verejné metóda riadenej fazule prostredníctvom @EventListener anotácia:

@Component public class AnnotationDrivenEventListener {@EventListener public void handleContextStart (ContextStartedEvent cse) {System.out.println ("Spracovanie udalosti spustenej v kontexte."); }}

Rovnako ako predtým podpis metódy deklaruje typ udalosti, ktorú spotrebuje.

V predvolenom nastavení je poslucháč vyvolaný synchronne. Môžeme ho však ľahko urobiť asynchrónnym pridaním znaku @Async anotácia. Musíme pamätať na umožnenie Async podpora v aplikácii.

6. Podpora generík

Je tiež možné odosielať udalosti s generickými informáciami v type udalosti.

6.1. Všeobecná udalosť aplikácie

Vytvorme všeobecný typ udalosti. V našom príklade obsahuje trieda udalosti akýkoľvek obsah a úspech indikátor stavu:

public class GenericSpringEvent {private T what; chránený boolovský úspech; public GenericSpringEvent (T what, boolean success) {this.what = what; this.success = úspech; } // ... štandardné vyhľadávače}

Všimnite si rozdiel medzi GenericSpringEvent a CustomSpringEvent. Teraz máme flexibilitu zverejňovať ľubovoľné udalosti a nie je potrebné od nej rozširovať ApplicationEvent už.

6.2. Poslucháč

Teraz poďme vytvoriť poslucháčom tejto udalosti. Poslucháča by sme mohli definovať implementáciou ApplicationListener rozhranie ako predtým:

Verejná trieda @Component GenericSpringEventListener implementuje ApplicationListener {@Override public void onApplicationEvent (@NonNull GenericSpringEvent event) {System.out.println ("Prijatá jarná generická udalosť -" + event.getWhat ()); }}

Ale táto definícia bohužiaľ vyžaduje, aby sme dedili GenericSpringEvent z ApplicationEvent trieda. Pre tento tutoriál teda využime predtým diskutovaný poslucháč udalostí založený na anotáciách.

Je tiež možné podmieniť poslucháča udalostí definovaním boolovského výrazu SpEL v @EventListener anotácia. V takom prípade sa obslužná rutina udalosti vyvolá iba pre úspešné uskutočnenie GenericSpringEvent z String:

@Component public class AnnotationDrivenEventListener {@EventListener (condition = "# event.success") public void handleSuccessful (GenericSpringEvent event) {System.out.println ("Handling generic event (conditional)."); }}

Jazyk Spring Expression Language (SpEL) je výkonný výrazový jazyk, ktorý je podrobne popísaný v ďalšom návode.

6.3. Vydavateľ

Vydavateľ udalosti je podobný tým, ktoré sú popísané vyššie. Ale kvôli vymazaniu typu musíme zverejniť udalosť, ktorá vyrieši všeobecný parameter, na ktorý by sme filtrovali. Napríklad, trieda GenericStringSpringEvent rozširuje GenericSpringEvent.

A je tu alternatívny spôsob publikovania udalostí. Ak vrátime nenulovú hodnotu z metódy anotovanej pomocou @EventListener vo výsledku nám Spring Framework zašle tento výsledok ako novú udalosť pre nás. Okrem toho môžeme publikovať viac nových udalostí tak, že ich vrátime do zbierky v dôsledku spracovania udalostí.

7. Transakčné viazané udalosti

Tento odsek sa týka používania @TransactionalEventListener anotácia. Ak sa chcete dozvedieť viac informácií o správe transakcií, pozrite si príručku Transakcie s jarou a JPA.

Od jari 4.2 poskytuje rámec nový @TransactionalEventListener anotácia, ktorá je rozšírením o @EventListener, ktorý umožňuje viazať poslucháča udalosti na fázu transakcie. Väzba je možná pre nasledujúce fázy transakcie:

  • AFTER_COMMIT (predvolené) sa používa na spustenie udalosti, ak k nej došlo úspešne dokončené
  • AFTER_ROLLBACK - ak transakcia má vrátený späť
  • AFTER_COMPLETION - ak transakcia má dokončené (alias pre AFTER_COMMIT a AFTER_ROLLBACK)
  • BEFORE_COMMIT sa používa na odpálenie práva udalosti predtým transakcia spáchať

Tu je rýchly príklad poslucháča transakčných udalostí:

@TransactionalEventListener (phase = TransactionPhase.BEFORE_COMMIT) public void handleCustom (udalosť CustomSpringEvent) {System.out.println ("Spracovanie udalosti v rámci transakcie PRED POVINNUTÍM."); }

Tento poslucháč bude vyvolaný, iba ak existuje transakcia, v ktorej je spustený producent udalosti a ktorá sa chystá potvrdiť.

A ak nie je spustená žiadna transakcia, udalosť sa neodosiela vôbec, pokiaľ to neprepíšeme nastavením záložné vykonanie atribút pravda.

8. Záver

V tomto rýchlom výučbe sme si prešli základy riešenie udalostí na jar - vytvorenie jednoduchej vlastnej udalosti, jej zverejnenie a následné spracovanie v poslucháčovi.

Mali sme tiež krátky pohľad na to, ako povoliť asynchrónne spracovanie udalostí v konfigurácii.

Potom sme sa dozvedeli o vylepšeniach zavedených na jar 4.2, ako sú poslucháči anotácií, lepšia podpora generík a väzba udalostí na fázy transakcie.

Ako vždy, kód uvedený v tomto článku je k dispozícii na stránkach Github. Toto je projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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