Vodič za grah vođen porukom u EJB-u

1. Uvod

Jednostavno rečeno, Enterprise JavaBean (EJB) je JEE komponenta koja se izvodi na aplikacijskom poslužitelju.

U ovom vodiču razgovarat ćemo o grahu vođenom porukama (MDB), odgovornom za rukovanje obradom poruka u asinkronom kontekstu.

MDB-ovi su dio JEE-a od specifikacije EJB 2.0; EJB 3.0 uveo je upotrebu napomena, olakšavajući stvaranje tih objekata. Ovdje ćemo se usredotočiti na bilješke.

2. Neke pozadine

Prije nego što uđemo u pojedinosti o porukama koje pokreću poruke, pregledajmo neke koncepte povezane s porukama.

2.1. Razmjena poruka

Poruke su komunikacijski mehanizam. Korištenjem poruka programi mogu razmjenjivati ​​podatke čak i ako su napisani na različitim programskim jezicima ili se nalaze u različitim operativnim sustavima.

Nudi lagano povezano rješenje; ni proizvođač ni potrošač informacija ne moraju znati detalje jedni o drugima.

Stoga ih ne moraju istovremeno biti povezani sa sustavom za razmjenu poruka (asinkrona komunikacija).

2.2. Sinkrona i asinkrona komunikacija

Tijekom sinkrone komunikacije, podnositelj zahtjeva čeka dok se odgovor ne vrati. U međuvremenu postupak podnositelja zahtjeva ostaje blokiran.

U asinkronoj komunikaciji, s druge strane, podnositelj zahtjeva pokreće operaciju, ali ona nije blokirana; podnositelj zahtjeva može prijeći na druge zadatke i odgovor će dobiti kasnije.

2.3. JMS

Java Message Services ("JMS") Java je API koji podržava razmjenu poruka.

JMS nudi peer to peer i objavljivanje / pretplatu modela razmjene poruka.

3. Grah vođen porukom

MDB je komponenta koju spremnik poziva svaki put kad poruka stigne u sustav za razmjenu poruka. Kao rezultat, ovaj događaj pokreće kôd unutar ovog graha.

U MDB-u možemo obaviti puno zadataka onMessage () metodu, jer prikazuje primljene podatke u pregledniku ili raščlanjuje i sprema ih u bazu podataka.

Drugi je primjer slanje podataka u drugi red nakon neke obrade. Sve se svodi na naša poslovna pravila.

3.1. Životni ciklus vožen grahom

MDB ima samo dva stanja:

  1. Ne postoji na spremniku
  2. stvorena i spremna za primanje poruka

Zavisnosti, ako postoje, ubrizgavaju se odmah nakon stvaranja MDB-a.

Da bismo izvršili upute prije primanja poruka, moramo označiti metodu s @ javax.ejb.PostConstruct.

I injekcije ovisnosti i @ javax.ejb.PostConstruct izvršenje se dogodi samo jednom.

Nakon toga, MDB je spreman za primanje poruka.

3.2. Transakcija

Poruka se može dostaviti MDB-u unutar konteksta transakcije.

Što znači da sve operacije unutar onMessage () metode dio su jedne transakcije.

Stoga, ako se dogodi vraćanje, sustav poruka ponovno isporučuje podatke.

4. Rad s grahom vođenim porukama

4.1. Stvaranje potrošača

Da bismo stvorili Bean Driven Bean, koristimo @ javax.ejb.MessageDriven napomena prije deklaracije naziva klase.

Da bismo obradili dolaznu poruku, moramo implementirati onMessage () metoda MessageListener sučelje:

@MessageDriven (activationConfig = {@ActivationConfigProperty (propertyName = "destination", propertyValue = "tutorialQueue"), @ActivationConfigProperty (propertyName = "destinationType", propertyValue = "javax.jms.Queue" publicM Readner Implements MesselaLSL PublicM {RealsMasLeLLLLLLLReadMestalLSLLReadMestalSpaceLaserBlagerBelementsMasterLeaseMistLagesListBeasmentsReviewesMastalL void onMessage (poruka poruke) {TextMessage textMessage = (TextMessage) poruka; isprobajte {System.out.println ("Poruka primljena:" + textMessage.getText ()); } catch (JMSException e) {System.out.println ("Pogreška pri pokušaju konzumiranja poruka:" + e.getMessage ()); }}}

Budući da se ovaj članak usredotočuje na bilješke umjesto .xml deskriptora koje ćemo koristiti @ActivationConfigProperty rađe nego .

@ActivationConfigProperty je svojstvo ključ / vrijednost koje predstavlja tu konfiguraciju. Unutar ćemo upotrijebiti dva svojstva activationConfig, postavljanje reda i vrste objekta koji će MDB trošiti.

Iznutra onMessage () metoda na koju možemo prebaciti parametar poruke TextMessage, BytesMessage, MapMessage StreamMessage ili ObjectMessage.

Međutim, za ovaj ćemo članak pogledati samo sadržaj poruke na standardnom izlazu.

4.2. Stvaranje proizvođača

Kao što je pokriveno u odjeljku 2.1, proizvođačke i potrošačke usluge potpuno su neovisne i mogu biti napisane na različitim programskim jezicima!

Naše ćemo poruke stvarati pomoću Java servleta:

@Override protected void doGet (HttpServletRequest req, HttpServletResponse res) baca ServletException, IOException {String text = req.getParameter ("text")! = Null? req.getParameter ("text"): "Pozdrav svijetu"; try (Context ic = new InitialContext (); ConnectionFactory cf = (ConnectionFactory) ic.lookup ("/ ConnectionFactory"); Queue queue = (Queue) ic.lookup ("queue / tutorialQueue"); Connection connection = cf.createConnection ( );) {Sesija sesije = connection.createSession (false, Session.AUTO_ACKNOWLEDGE); MessageProducer izdavač = session .createProducer (red čekanja); connection.start (); TextMessage poruka = ​​session.createTextMessage (tekst); publisher.send (poruka); } catch (NamingException | JMSException e) {res.getWriter () .println ("Pogreška pri pokušaju slanja poruke:" + e.getMessage ()); } res.getWriter () .println ("Poruka poslana:" + tekst); }

Nakon dobivanja ConnectionFactory i Red instance, moramo stvoriti Veza i Sjednica.

Da bismo stvorili sesiju, nazivamo createSession metoda.

Prvi parametar u createSession je boolean koji definira je li sesija dio transakcije ili ne.

Drugi se parametar koristi samo kada je prvi lažno. Omogućuje nam opis načina potvrde koji se odnosi na dolazne poruke i uzima vrijednosti od Sjednica.AUTO_ACKNOWLEDGE, Sesija.CLIENT_ACKNOWLEDGE i Sjednica.DUPS_OK_ACKNOWLEDGE.

Sada možemo započeti vezu, stvoriti tekstualnu poruku na objektu sesije i poslati našu poruku.

Potrošač, vezan za isti red, primit će poruku i izvršiti svoj asinkroni zadatak.

Također, osim podizanja pogleda JNDI objekata, sve radnje u našem bloku try-with-resources osiguravaju da je veza zatvorena ako JMSException naiđe na pogrešku, poput pokušaja povezivanja s nepostojećim redom ili navođenja pogrešnog broja porta za povezivanje.

5. Testiranje graha vođenog porukom

Pošaljite poruku putem DOBITI metoda na SendMessageServlet, kao u:

//127.0.0.1:8080/producer/SendMessageServlet?text=Text za slanje

Također, servlet šalje "Pozdrav svijete" u red ako ne pošaljemo nikakve parametre, kao u //127.0.0.1:8080/producer/SendMessageServlet.

6. Zaključak

Poruke vođene grahom omogućuju jednostavno stvaranje aplikacije temeljene na redu čekanja.

Stoga, MDB-ovi nam omogućuju razdvajanje aplikacija na manje usluge s lokaliziranim odgovornostima, omogućujući puno modularniji i inkrementalni sustav koji se može oporaviti od kvarova sustava.

Kao i uvijek kod je gotov na GitHub-u.


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