En guide til meddelelsesdrevne bønner i EJB

1. Introduktion

Kort sagt, en Enterprise JavaBean (EJB) er en JEE-komponent, der kører på en applikationsserver.

I denne vejledning diskuterer vi Message Driven Beans (MDB), der er ansvarlig for håndtering af meddelelsesbehandling i en asynkron kontekst.

MDB'er er en del af JEE siden EJB 2.0-specifikationen; EJB 3.0 introducerede brugen af ​​annoteringer, hvilket gør det lettere at oprette disse objekter. Her vil vi fokusere på kommentarer.

2. Noget baggrund

Før vi dykker ned i detaljerne om Message Driven Beans, lad os gennemgå nogle begreber relateret til messaging.

2.1. Beskeder

Beskeder er en kommunikationsmekanisme. Ved at bruge messaging kan programmer udveksle data, selvom de er skrevet på forskellige programsprog eller findes i forskellige operativsystemer.

Det tilbyder en løst koblet løsning; hverken producenten eller forbrugeren af ​​oplysningerne har brug for at kende detaljer om hinanden.

Derfor behøver de ikke engang at være forbundet til meddelelsessystemet på samme tid (asynkron kommunikation).

2.2. Synkron og asynkron kommunikation

Under synkron kommunikation venter rekvirenten, indtil svaret er tilbage. I mellemtiden forbliver anmodningsprocessen blokeret.

I asynkron kommunikation på den anden side starter anmoderen operationen, men er ikke blokeret af den; rekvirenten kan gå videre til andre opgaver og modtage svaret senere.

2.3. JMS

Java Message Services (“JMS”) er en Java API, der understøtter messaging.

JMS leverer peer-to-peer og publicerer / abonnerer messaging-modeller.

3. Message Driven Beans

En MDB er en komponent, der påberåbes af containeren, hver gang en meddelelse ankommer til messaging-systemet. Som et resultat udløser denne begivenhed koden inde i denne bønne.

Vi kan udføre mange opgaver inde i en MDB onMessage () metode, da de modtagne data vises i en browser eller parsing og gemmes i en database.

Et andet eksempel er at sende data til en anden kø efter nogle behandlinger. Det hele kommer ned på vores forretningsregler.

3.1. Beskeddrevne bønner livscyklus

En MDB har kun to tilstande:

  1. Den findes ikke på containeren
  2. oprettet og klar til at modtage beskeder

Afhængighederne, hvis de er til stede, injiceres lige efter MDB er oprettet.

For at udføre instruktioner, inden vi modtager meddelelser, skal vi kommentere en metode med @ javax.ejb.PostConstruct.

Både afhængighedsinjektion og @ javax.ejb.PostConstruct udførelse sker kun én gang.

Derefter er MDB klar til at modtage meddelelser.

3.2. Transaktion

En besked kan leveres til en MDB inden for en transaktionssammenhæng.

Det betyder, at alle operationer inden for onMessage () metode er en del af en enkelt transaktion.

Derfor, hvis der sker en tilbageførsel, leverer meddelelsessystemet dataene igen.

4. Arbejde med meddelelsesdrevne bønner

4.1. Oprettelse af forbrugeren

For at oprette en Message Driven Bean bruger vi @ javax.ejb.MessageDriven kommentar før klassedeklarationen.

For at håndtere den indgående besked skal vi implementere onMessage () metode til MessageListener grænseflade:

@MessageDriven (aktiveringConfig = {@ActivationConfigProperty (propertyName = "destination", propertyValue = "tutorialQueue"), @ActivationConfigProperty (propertyName = "destinationType", propertyValue = "javax.jms.Queue")}) public class ReadMessMM ugyldig onMessage (beskedbesked) {TextMessage textMessage = (TextMessage) besked; prøv {System.out.println ("Besked modtaget:" + textMessage.getText ()); } fange (JMSException e) {System.out.println ("Fejl under forsøg på at forbruge beskeder:" + e.getMessage ()); }}}

Da denne artikel fokuserer på annoteringer i stedet for .xml-deskriptorer, vi bruger @ActivationConfigProperty hellere end .

@ActivationConfigProperty er en nøgleværdiegenskab, der repræsenterer denne konfiguration. Vi bruger to egenskaber indeni aktiveringConfig, indstilling af køen og typen af ​​objekt, som MDB vil forbruge.

Inde onMessage () metode, vi kan kaste meddelelsesparameter til TextMessage, BytesMessage, MapMessage StreamMessage eller Objektbesked.

For denne artikel ser vi dog kun på meddelelsesindholdet på standardoutput.

4.2. Oprettelse af producenten

Som dækket i afsnit 2.1, producent- og forbrugertjenester er helt uafhængige og kan endda skrives på forskellige programmeringssprog!

Vi producerer vores meddelelser ved hjælp af Java Servlets:

@ Override beskyttet ugyldigt doGet (HttpServletRequest req, HttpServletResponse res) kaster ServletException, IOException {String text = req.getParameter ("text")! = Null? req.getParameter ("tekst"): "Hej verden"; prøv (Kontekst ic = ny InitialContext (); ConnectionFactory cf = (ConnectionFactory) ic.lookup ("/ ConnectionFactory"); Kø kø = (Kø) ic.lookup ("kø / tutorialQue"); Forbindelsesforbindelse = jf. skabeConnection ( );) {Session session = connection.createSession (false, Session.AUTO_ACKNOWLEDGE); MessageProducer publisher = session .createProducer (kø); forbindelse.start (); TextMessage meddelelse = session.createTextMessage (tekst); publisher.send (besked); } fange (NamingException | JMSException e) {res.getWriter () .println ("Fejl under forsøg på at sende besked:" + e.getMessage ()); } res.getWriter () .println ("Besked sendt:" + tekst); }

Efter at have opnået ConnectionFactory og tilfælde skal vi oprette en Forbindelse og Session.

For at oprette en session kalder vi createSession metode.

Den første parameter i createSession er en boolsk som definerer, om sessionen er en del af en transaktion eller ej.

Den anden parameter bruges kun, når den første er falsk. Det giver os mulighed for at beskrive den anerkendelsesmetode, der gælder for indgående beskeder og tager værdierne af Session.AUTO_ACKNOWLEDGE, Session.CLIENT_ACKNOWLEDGE og Session.DUPS_OK_ACKNOWLEDGE.

Vi kan nu starte forbindelsen, oprette en tekstbesked på sessionobjektet og sende vores besked.

En forbruger, der er bundet til den samme kø, modtager en besked og udfører sin asynkrone opgave.

Også bortset fra at kigge op JNDI objekter, alle handlinger i vores prøve-med-ressourcer-blok sørger for, at forbindelsen er lukket, hvis JMSException støder på en fejl, såsom at prøve at oprette forbindelse til en ikke-eksisterende kø eller at angive et forkert portnummer, der skal oprettes forbindelse.

5. Test af den meddelelsesdrevne bønne

Send en besked via metode til SendMessageServlet, som i:

//127.0.0.1:8080/producer/SendMessageServlet?text=Text at sende

Servetten sender også "Hej Verden" til køen, hvis vi ikke sender nogen parametre som i //127.0.0.1:8080/producer/SendMessageServlet.

6. Konklusion

Message Driven Beans tillader enkel oprettelse af en købaseret applikation.

Derfor, MDB'er giver os mulighed for at afkoble vores applikationer til mindre tjenester med lokalt ansvar, der tillader et meget mere modulært og inkrementelt system, der kan komme sig efter systemfejl.

Som altid er koden forbi på GitHub.