Útmutató az üzenetvezérelt babokhoz az EJB-ben

1. Bemutatkozás

Egyszerűen fogalmazva: az Enterprise JavaBean (EJB) egy JEE-összetevő, amely egy alkalmazáskiszolgálón fut.

Ebben az oktatóanyagban megvitatjuk az üzenetvezérelt babokat (MDB), akik az aszinkron kontextusban felelősek az üzenetek feldolgozásáért.

Az MDB-k az EJB 2.0 specifikáció óta a JEE részei; Az EJB 3.0 bevezette az annotációk használatát, megkönnyítve azoknak az objektumoknak a létrehozását. Itt a jegyzetekre fogunk összpontosítani.

2. Néhány háttér

Mielőtt elmélyülnénk az üzenetvezérelt bab részleteiben, tekintsük át az üzenetküldéssel kapcsolatos néhány fogalmat.

2.1. Üzenetek

Az üzenetküldés egy kommunikációs mechanizmus. Az üzenetküldés használatával a programok akkor is cserélhetnek adatot, ha különböző programnyelveken vannak megírva, vagy különböző operációs rendszerekben találhatók.

Lazán összekapcsolt megoldást kínál; sem az információ előállítójának, sem fogyasztójának nem kell tudnia egymásról a részleteket.

Ezért nem is kell egyszerre csatlakozniuk az üzenetkezelő rendszerhez (aszinkron kommunikáció).

2.2. Szinkron és aszinkron kommunikáció

A szinkron kommunikáció során az igénylő megvárja, amíg a válasz vissza nem érkezik. Addig a kérelmező folyamata blokkolt marad.

Az aszinkron kommunikációban viszont az igénylő kezdeményezi a műveletet, de nem blokkolja; az igénylő továbbléphet más feladatokra, és később megkapja a választ.

2.3. JMS

A Java Message Services („JMS”) egy Java API, amely támogatja az üzenetküldést.

A JMS biztosítja a peer to peer és a közzététel / előfizetés üzenetküldési modelleket.

3. Üzenettel vezérelt bab

Az MDB egy olyan összetevő, amelyet a tároló hív meg, valahányszor üzenet érkezik az üzenetküldő rendszerre. Ennek eredményeként ez az esemény elindítja a kódot ebben a babban.

Nagyon sok feladatot elvégezhetünk egy MDB-n belül onMessage () módszer, mivel a fogadott adatok megjelenítése egy böngészőben vagy elemzés és mentés egy adatbázisba.

Egy másik példa az adatok elküldése egy másik sorba némi feldolgozás után. Mindez az üzleti szabályainknak felel meg.

3.1. Üzenettel vezérelt bab életciklus

Az MDB-nek csak két állapota van:

  1. Nem létezik a tárolón
  2. létrehozott és készen áll az üzenetek fogadására

A függőségeket, ha vannak, közvetlenül az MDB létrehozása után injektálják.

Az üzenetek fogadása előtti utasítások végrehajtásához meg kell jegyeznünk egy metódust @ javax.ejb.PostConstruct.

Mind a függőségi injekció, mind a @ javax.ejb.PostConstruct kivégzés csak egyszer fordul elő.

Ezt követően az MDB készen áll az üzenetek fogadására.

3.2. Tranzakció

Üzenet szállítható egy MDB-hez tranzakciós környezetben.

Ez azt jelenti, hogy a onMessage () módszer egyetlen tranzakció részét képezik.

Ezért, ha visszagörgetés történik, az üzenetrendszer újra elküldi az adatokat.

4. Munka az üzenet által vezérelt babokkal

4.1. A Fogyasztó létrehozása

A Message Driven Bean létrehozásához használjuk @ javax.ejb.MessageDriven kommentár az osztálynév deklaráció előtt.

A bejövő üzenet kezeléséhez végre kell hajtanunk a onMessage () módszere MessageListener felület:

@MessageDriven (activationConfig = {@ActivationConfigProperty (tulajdonságNév = "cél", tulajdonságValue = "tutorialQueue"), @ActivationConfigProperty (tulajdonságNév = "célType", tulajdonságValue = "javax.jms.Queue")}) nyilvános osztály olvasási üzenet void onMessage (Üzenet) {TextMessage textMessage = (TextMessage) üzenet; próbáld meg a {System.out.println ("Üzenet beérkezett:" + textMessage.getText ()); } catch (JMSException e) {System.out.println ("Hiba az üzenetek elfogyasztása közben:" + e.getMessage ()); }}}

Mivel ez a cikk az annotációkra összpontosít, az általunk használt .xml leírók helyett @ActivationConfigProperty inkább mint .

@ActivationConfigProperty egy kulcsérték tulajdonság, amely az adott konfigurációt képviseli. Két tulajdonságot fogunk használni belül activationConfig, beállítva a várólistát és az MDB által elfogyasztandó objektum típusát.

Belül onMessage () metódus, amelybe üzenetparamétert vethetünk TextMessage, BytesMessage, MapMessage StreamMessage vagy ObjectMessage.

Ehhez a cikkhez azonban csak az üzenetek tartalmát vesszük figyelembe a szabványos kimeneten.

4.2. A Producer létrehozása

A 2.1. Szakaszban leírtak szerint a termelői és a fogyasztói szolgáltatások teljesen függetlenek, és akár különféle programozási nyelveken is írhatók!

Üzeneteinket a Java Servlet segítségével készítjük el:

@Orride protected void doGet (HttpServletRequest req, HttpServletResponse res) dobja a ServletException, IOException {String text = req.getParameter ("text")! = Null? req.getParameter ("szöveg"): "Hello World"; próbáld meg (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); MessageProducer publisher = munkamenet .createProducer (sor); kapcsolat.indítás (); TextMessage message = session.createTextMessage (szöveg); kiadó.küldés (üzenet); } catch (NamingException | JMSException e) {res.getWriter () .println ("Hiba üzenet küldésekor:" + e.getMessage ()); } res.getWriter () .println ("Üzenet elküldve:" + szöveg); }

Miután megszerezte a ConnectionFactory és Sor példányokat, létre kell hoznunk a Kapcsolat és Ülés.

Munkamenet létrehozásához hívjuk a createSession módszer.

Az első paraméter a createSession egy logikai amely meghatározza, hogy a munkamenet tranzakció része-e vagy sem.

A második paramétert csak akkor használja, ha az első hamis. Ez lehetővé teszi számunkra a nyugtázási módszer leírását, amely a bejövő üzenetekre vonatkozik és felveszi a Munkamenet.AUTO_ACKNOWLEDGE, Munkamenet.CLIENT_ACKNOWLEDGE és Munkamenet.DUPS_OK_ACKNOWLEDGE.

Most megkezdhetjük a kapcsolatot, létrehozhatunk egy szöveges üzenetet a session objektumon és elküldhetjük az üzenetünket.

Azonos sorba kötött fogyasztó üzenetet kap, és elvégzi aszinkron feladatát.

Továbbá, eltekintve a felnézéstől JNDI objektumok, az összes próbálkozás az erőforrásokkal blokkban ellenőrizze, hogy a kapcsolat zárva van-e, ha JMSException hibával találkozik, például megpróbál csatlakozni egy nem létező sorhoz, vagy rossz csatlakozási számot ad meg a csatlakozáshoz.

5. Az üzenetvezérelt bab tesztelése

Küldjön üzenetet a KAP módszer be SendMessageServlet, mint a:

//127.0.0.1:8080/producer/SendMessageServlet?text=Küldendő szöveg

Továbbá, a szervlet küldi "Helló Világ" ha nem küldünk semmilyen paramétert, mint a //127.0.0.1:8080/producer/SendMessageServlet.

6. Következtetés

Az üzenetvezérelt bab lehetővé teszi a soron alapuló alkalmazás egyszerű létrehozását.

Ebből kifolyólag, Az MDB-k lehetővé teszik számunkra, hogy szétválasszuk az alkalmazásokat kisebb szolgáltatásokra, lokalizált felelősséggel, lehetővé téve egy sokkal modulárisabb és inkrementálisabb rendszert, amely helyreállhat a rendszerhibákból.

Mint mindig, a kódnak vége a GitHubon.