Sprievodca správami riadenými fazuľami v EJB

1. Úvod

Zjednodušene povedané, Enterprise JavaBean (EJB) je komponent JEE, ktorý beží na aplikačnom serveri.

V tomto výučbe sa dozvieme o Message Driven Beans (MDB) zodpovedných za spracovanie správ v asynchrónnom kontexte.

MDB sú súčasťou JEE od špecifikácie EJB 2.0; EJB 3.0 zaviedol použitie anotácií, čo uľahčuje vytváranie týchto objektov. Tu sa zameriame na anotácie.

2. Niektoré pozadia

Predtým, ako sa ponoríme do podrobností o riadených fazuľach správy, prečítajme si niektoré koncepty súvisiace so správami.

2.1. Správy

Správy sú komunikačným mechanizmom. Vďaka používaniu správ si môžu programy vymieňať údaje, aj keď sú napísané v rôznych programovacích jazykoch alebo sa nachádzajú v rôznych operačných systémoch.

Ponúka voľne spojené riešenie; ani výrobca ani spotrebiteľ informácií o sebe nemusí vedieť ďalšie podrobnosti.

Preto nemusia byť ani naraz pripojené k systému správ (asynchrónna komunikácia).

2.2. Synchrónna a asynchrónna komunikácia

Počas synchrónnej komunikácie žiadateľ čaká, kým sa odpoveď vráti. Medzitým zostane proces žiadateľa zablokovaný.

Na druhej strane v asynchrónnej komunikácii žiadateľ iniciuje operáciu, ale nie je ňou blokovaný; žiadateľ môže prejsť k ďalším úlohám a odpoveď dostať neskôr.

2.3. JMS

Java Message Services („JMS“) je rozhranie Java API, ktoré podporuje zasielanie správ.

JMS poskytuje modely správ typu peer to peer a publikovanie / prihlásenie na odber.

3. Fazuľa riadená správou

MDB je komponent vyvolaný kontajnerom zakaždým, keď správa dorazí do systému správ. Výsledkom je, že táto udalosť spustí kód vo vnútri tejto fazule.

V rámci MDB môžeme vykonávať veľa úloh onMessage () spôsob zobrazenia prijatých údajov v prehliadači alebo ich syntaktická analýza a uloženie do databázy.

Ďalším príkladom je odoslanie údajov do iného frontu po určitom spracovaní. Všetko závisí od našich obchodných pravidiel.

3.1. Životný cyklus fazule riadenej správami

MDB má iba dva stavy:

  1. Na kontajneri neexistuje
  2. vytvorené a pripravené na príjem správ

Závislosti, ak existujú, sa vložia hneď po vytvorení MDB.

Aby sme mohli vykonať pokyny pred prijatím správy, musíme anotovať metódu pomocou @ javax.ejb.PostConstruct.

Injekcia závislostí aj @ javax.ejb.PostConstruct poprava sa stala iba raz.

Potom je MDB pripravený na príjem správ.

3.2. Transakcia

Správu je možné doručiť na MDB v kontexte transakcie.

To znamená, že všetky operácie v rámci onMessage () sú súčasťou jednej transakcie.

Preto ak dôjde k vráteniu späť, systém správ znovu doručí údaje.

4. Práca s fazuľami riadenými správami

4.1. Vytvorenie spotrebiteľa

Na vytvorenie objektu Bean riadeného správou používame @ javax.ejb.MessageDriven anotácia pred deklaráciou názvu triedy.

Aby sme mohli vybaviť prichádzajúcu správu, musíme implementovať onMessage () metóda MessageListener rozhranie:

@MessageDriven (activationConfig = {@ActivationConfigProperty (propertyName = "destination", propertyValue = "tutorialQueue"), @ActivationConfigProperty (propertyName = "destinationType", propertyValue = "javax.jms.Queue")}) verejná trieda ReadMessageMDB implements void onMessage (správa správy) {TextMessage textMessage = správa (TextMessage); try {System.out.println ("Prijatá správa:" + textMessage.getText ()); } catch (JMSException e) {System.out.println ("Chyba pri pokuse o konzumáciu správ:" + e.getMessage ()); }}}

Pretože sa tento článok zameriava na anotácie namiesto na deskriptory .xml, použijeme ich @ActivationConfigProperty radšej než .

@ActivationConfigProperty je vlastnosť kľúč - hodnota, ktorá predstavuje túto konfiguráciu. Vo vnútri použijeme dve vlastnosti activationConfig, nastavenie frontu a typ objektu, ktorý MDB spotrebuje.

Vo vnútri onMessage () metóda, na ktorú môžeme obsadiť parameter správy TextMessage, BytesMessage, MapMessage StreamMessage alebo ObjectMessage.

V tomto článku sa však pozrieme iba na obsah správy na štandardnom výstupe.

4.2. Vytvorenie producenta

Ako je uvedené v časti 2.1, služby zákazníkom a výrobcom sú úplne nezávislé a môžu byť napísané dokonca v rôznych programovacích jazykoch!

Naše správy budeme vyrábať pomocou servletov Java:

@Override protected void doGet (HttpServletRequest req, HttpServletResponse res) vyvolá ServletException, IOException {String text = req.getParameter ("text")! = Null? req.getParameter ("text"): "Hello World"; try (Context ic = new InitialContext (); ConnectionFactory cf = (ConnectionFactory) ic.lookup ("/ ConnectionFactory"); Queue queue = (Queue) ic.lookup ("queue / tutorialQueue"); Connection connection = cf.createConnection ( );) {Session session = connection.createSession (false, Session.AUTO_ACKNOWLEDGE); Vydavateľ MessageProducer = relácia .createProducer (front); connection.start (); TextMessage message = session.createTextMessage (text); publisher.send (správa); } catch (NamingException | JMSException e) {res.getWriter () .println ("Chyba pri pokuse o odoslanie správy:" + e.getMessage ()); } res.getWriter () .println ("Správa odoslaná:" + text); }

Po získaní ConnectionFactory a Fronta inštancie, musíme vytvoriť Pripojenie a Session.

Na vytvorenie relácie voláme createSession metóda.

Prvý parameter v createSession je a boolovský ktorá definuje, či je relácia súčasťou transakcie alebo nie.

Druhý parameter sa použije, iba ak je prvý nepravdivé. Umožňuje nám popísať metódu potvrdenia, ktorá sa vzťahuje na prichádzajúce správy, a nadobúda hodnoty Session.AUTO_ACKNOWLEDGE, Session.CLIENT_ACKNOWLEDGE a Session.DUPS_OK_ACKNOWLEDGE.

Teraz môžeme nadviazať spojenie, vytvoriť textovú správu na objekte relácie a odoslať našu správu.

Spotrebiteľ viazaný na rovnaký rad dostane správu a vykoná svoju asynchrónnu úlohu.

Tiež, okrem vzhliadania JNDI objekty, všetky akcie v našom bloku try-with-resources skontrolujte, či je spojenie ukončené, ak JMSException vyskytne chyba, napríklad pokus o pripojenie k neexistujúcemu frontu alebo zadanie nesprávneho čísla portu na pripojenie.

5. Testovanie prostriedku Bean riadeného správou

Poslať správu cez ZÍSKAJTE metóda na SendMessageServlet, ako v:

//127.0.0.1:8080/producer/SendMessageServlet?text=Text na odoslanie

Servlet sa tiež odošle „Hello World“ do frontu, ak neposielame žiadne parametre, ako v //127.0.0.1:8080/producer/SendMessageServlet.

6. Záver

Fazuľa riadená správami umožňuje jednoduché vytváranie aplikácií založených na frontoch.

Preto MDB nám umožňujú oddeliť naše aplikácie od menších služieb s lokalizovanou zodpovednosťou, čo umožňuje oveľa modulárnejší a prírastkovejší systém, ktorý sa dokáže zotaviť zo zlyhaní systému.

Ako vždy je kód na GitHube u konca.


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