En guide til meldingsdrevne bønner i EJB

1. Introduksjon

Enkelt sagt, en Enterprise JavaBean (EJB) er en JEE-komponent som kjører på en applikasjonsserver.

I denne opplæringen diskuterer vi Message Driven Beans (MDB), som er ansvarlig for å håndtere meldingsbehandling i en asynkron sammenheng.

MDB er en del av JEE siden EJB 2.0-spesifikasjonen; EJB 3.0 introduserte bruken av merknader, noe som gjør det lettere å lage disse gjenstandene. Her vil vi fokusere på merknader.

2. Noe bakgrunn

Før vi dykker ned i Message Driven Beans-detaljene, la oss se gjennom noen konsepter relatert til meldinger.

2.1. Meldinger

Meldinger er en kommunikasjonsmekanisme. Ved å bruke meldinger kan programmer utveksle data selv om de er skrevet på forskjellige programspråk eller ligger i forskjellige operativsystemer.

Den tilbyr en løs koblet løsning; verken produsenten eller forbrukeren av informasjonen trenger å vite detaljer om hverandre.

Derfor trenger de ikke engang å være koblet til meldingssystemet samtidig (asynkron kommunikasjon).

2.2. Synkron og asynkron kommunikasjon

Under synkron kommunikasjon venter rekvirenten til svaret er tilbake. I mellomtiden forblir rekvirentprosessen blokkert.

I asynkron kommunikasjon, derimot, initierer rekvirenten operasjonen, men blir ikke blokkert av den; rekvirenten kan gå videre til andre oppgaver og motta svaret senere.

2.3. JMS

Java Message Services (“JMS”) er et Java API som støtter meldinger.

JMS tilbyr peer to peer og publiserer / abonnerer på meldingsmodeller.

3. Message Driven Beans

En MDB er en komponent som beholderen påkaller hver gang en melding kommer til meldingssystemet. Som et resultat utløser denne hendelsen koden i denne bønnen.

Vi kan utføre mange oppgaver i en MDB onMessage () metode, siden de mottatte dataene vises i en nettleser eller parsing og lagres i en database.

Et annet eksempel er å sende inn data til en annen kø etter litt behandling. Det hele kommer ned på forretningsreglene våre.

3.1. Melding Driven Beans Lifecycle

En MDB har bare to stater:

  1. Den eksisterer ikke på containeren
  2. opprettet og klar til å motta meldinger

Avhengighetene, hvis de er til stede, injiseres rett etter at MDB er opprettet.

For å utføre instruksjoner før vi mottar meldinger, må vi kommentere en metode med @ javax.ejb.PostConstruct.

Både avhengighetsinjeksjon og @ javax.ejb.PostConstruct henrettelse skjer bare en gang.

Etter det er MDB klar til å motta meldinger.

3.2. Transaksjon

En melding kan leveres til en MDB i en transaksjonssammenheng.

Betyr at alle operasjoner i onMessage () metoden er en del av en enkelt transaksjon.

Derfor, hvis en tilbakestilling skjer, leverer meldingssystemet dataene på nytt.

4. Arbeide med meldingsdrevne bønner

4.1. Opprette forbrukeren

For å lage en Message Driven Bean bruker vi @ javax.ejb.MessageDriven kommentar før klassenavnedeklarasjonen.

For å håndtere den innkommende meldingen, må vi implementere onMessage () metoden for MessageListener grensesnitt:

@MessageDriven (aktiveringConfig = {@ActivationConfigProperty (propertyName = "destination", propertyValue = "tutorialQueue"), @ActivationConfigProperty (propertyName = "destinationType", propertyValue = "javax.jms.Queue")}) offentlig klasse ReadMessMessMessMessM ugyldig onMessage (melding) {TextMessage textMessage = (TextMessage) melding; prøv {System.out.println ("Melding mottatt:" + textMessage.getText ()); } fange (JMSException e) {System.out.println ("Feil under forsøk på å konsumere meldinger:" + e.getMessage ()); }}}

Siden denne artikkelen fokuserer på merknader i stedet for .xml-beskrivelser vi bruker @ActivationConfigProperty heller enn .

@ActivationConfigProperty er en nøkkelverdiegenskap som representerer den konfigurasjonen. Vi bruker to egenskaper inne aktiveringKonfig, angir køen og typen objekt MDB vil forbruke.

Innsiden onMessage () metode vi kan kaste meldingsparameter til TextMessage, BytesMessage, MapMessage StreamMessage eller ObjectMessage.

For denne artikkelen vil vi imidlertid bare se på meldingsinnholdet på standardutdata.

4.2. Opprette produsenten

Som dekket i avsnitt 2.1, produsent- og forbrukertjenester er helt uavhengige og kan til og med skrives på forskjellige programmeringsspråk!

Vi produserer meldingene våre ved hjelp av Java Servlets:

@ Override beskyttet ugyldig doGet (HttpServletRequest req, HttpServletResponse res) kaster ServletException, IOException {String text = req.getParameter ("text")! = Null? req.getParameter ("text"): "Hello World"; prøv (Context ic = new InitialContext (); ConnectionFactory cf = (ConnectionFactory) ic.lookup ("/ ConnectionFactory"); Kø kø = (Kø) ic.lookup ("kø / tutorialQue"); Tilkoblingstilkobling = jfr. );) {Session session = connection.createSession (false, Session.AUTO_ACKNOWLEDGE); MessageProducer publisher = økt .createProducer (kø); connection.start (); TextMessage melding = session.createTextMessage (tekst); publisher.send (melding); } catch (NamingException | JMSException e) {res.getWriter () .println ("Feil under forsøk på å sende melding:" + e.getMessage ()); } res.getWriter () .println ("Melding sendt:" + tekst); }

Etter å ha oppnådd ConnectionFactory og tilfeller, må vi opprette en Forbindelse og Økt.

For å lage en økt, kaller vi createSession metode.

Den første parameteren i createSession er en boolsk som definerer om økten er en del av en transaksjon eller ikke.

Den andre parameteren brukes bare når den første er falsk. Det lar oss beskrive bekreftelsesmetoden som gjelder innkommende meldinger og tar verdiene av Session.AUTO_ACKNOWLEDGE, Session.CLIENT_ACKNOWLEDGE og Session.DUPS_OK_ACKNOWLEDGE.

Vi kan nå starte forbindelsen, opprette en tekstmelding på øktobjektet og sende meldingen vår.

En forbruker, bundet til samme kø, vil motta en melding og utføre sin asynkrone oppgave.

Også, bortsett fra å se opp JNDI objekter, alle handlinger i vår prøve-med-ressurser-blokk sørger for at forbindelsen er stengt hvis JMS-unntak støter på en feil, for eksempel å prøve å koble til en ikke-eksisterende kø eller angi et feil portnummer å koble til.

5. Testing av meldingsdrevet bønne

Send en melding gjennom metode på SendMessageServlet, som i:

//127.0.0.1:8080/producer/SendMessageServlet?text=Tekst å sende

Servetten sender også "Hei Verden" til køen hvis vi ikke sender noen parametere, som i //127.0.0.1:8080/producer/SendMessageServlet.

6. Konklusjon

Message Driven Beans tillater enkel oppretting av et købasert program.

Derfor, MDB-er tillater oss å koble søknadene våre inn i mindre tjenester med lokal ansvar, som tillater et mye mer modulært og inkrementelt system som kan komme seg etter systemfeil.

Som alltid er koden over på GitHub.


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