logo

JMS veiledning

JMS (Java Message Service) er et API som gir mulighet for å opprette, sende og lese meldinger. Det gir løst koblet, pålitelig og asynkron kommunikasjon.

git push-kommando

JMS er også kjent som en meldingstjeneste.


Forstå meldinger

Meldinger er en teknikk for å kommunisere applikasjoner eller programvarekomponenter.

JMS brukes hovedsakelig til å sende og motta meldinger fra en applikasjon til en annen.


Krav til JMS

Vanligvis sender brukeren melding til applikasjonen. Men hvis vi ønsker å sende meldinger fra en applikasjon til en annen, må vi bruke JMS API.

Tenk på et scenario, en applikasjon A kjører i INDIA og en annen applikasjon B kjører i USA. For å sende melding fra A-applikasjon til B, må vi bruke JMS.


Fordel med JMS

1) Asynkron: For å motta meldingen trenger ikke klienten å sende forespørselen. Meldingen kommer automatisk til klienten.

2) Pålitelig: Det gir sikkerhet for at meldingen blir levert.


Meldingsdomener

Det er to typer meldingsdomener i JMS.

  1. Punkt-til-punkt meldingsdomene
  2. Utgiver-/abonnentmeldingsdomene

1) Punkt-til-punkt (PTP) meldingsdomene

I PTP-modellen er en melding levert til én mottaker bare. Her, brukes som en meldingsorientert mellomvare (MOM).

Køen er ansvarlig for å holde meldingen til mottakeren er klar.

I PTP-modellen er det ingen tidsavhengighet mellom avsender og mottaker.


2) Utgiver/abonnent (Pub/Sub) meldingsdomene

I Pub/Sub-modellen er en melding levert til alle abonnenter . Det er som å kringkaste. Her, Emne brukes som en meldingsorientert mellomvare som er ansvarlig for å holde og levere meldinger.

I PTP-modellen er det tidsavhengighet mellom utgiver og abonnent.



JMS programmeringsmodell


Eksempel på JMS-kø

For å utvikle JMS-køeksempel, må du installere en hvilken som helst applikasjonsserver. Her bruker vi glassfish3 server hvor vi lager to JNDI.

  1. Opprett tilkobling fabrikken navngitt myQueueConnectionFactory
  2. Opprett destinasjonsressurs med navn min kø

Etter å ha opprettet JNDI, lag server- og mottakerapplikasjon. Du må kjøre server og mottaker i en annen konsoll. Her bruker vi eclipse IDE, den åpnes i en annen konsoll som standard.

1) Opprett tilkoblingsfabrikk og destinasjonsressurs

Åpne serveradministrasjonskonsollen ved hjelp av URL-en http://localhost:4848

Logg inn med brukernavn og passord.

Klikk på JMS Ressurs -> Tilkoblingsfabrikker -> Ny , skriv nå bassengnavnet og velg ressurstype som QueueConnectionFactory og klikk deretter på ok-knappen.

Klikk på JMS-ressurs -> Destinasjonsressurser -> Ny , skriv nå JNDI-navnet og det fysiske destinasjonsnavnet og klikk deretter på ok-knappen.

2) Opprett avsender- og mottakerapplikasjon

La oss se avsender- og mottakerkoden. Merk at mottakeren er knyttet til lytteren som vil bli påkalt når brukeren sender melding.

Fil: MySender.java
 import java.io.BufferedReader; import java.io.InputStreamReader; import javax.naming.*; import javax.jms.*; public class MySender { public static void main(String[] args) { try { //Create and start connection InitialContext ctx=new InitialContext(); QueueConnectionFactory f=(QueueConnectionFactory)ctx.lookup('myQueueConnectionFactory'); QueueConnection con=f.createQueueConnection(); con.start(); //2) create queue session QueueSession ses=con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Queue object Queue t=(Queue)ctx.lookup('myQueue'); //4)create QueueSender object QueueSender sender=ses.createSender(t); //5) create TextMessage object TextMessage msg=ses.createTextMessage(); //6) write message BufferedReader b=new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.println('Enter Msg, end to terminate:'); String s=b.readLine(); if (s.equals('end')) break; msg.setText(s); //7) send message sender.send(msg); System.out.println('Message successfully sent.'); } //8) connection close con.close(); }catch(Exception e){System.out.println(e);} } } 
Fil: MyReceiver.java
 import javax.jms.*; import javax.naming.InitialContext; public class MyReceiver { public static void main(String[] args) { try{ //1) Create and start connection InitialContext ctx=new InitialContext(); QueueConnectionFactory f=(QueueConnectionFactory)ctx.lookup('myQueueConnectionFactory'); QueueConnection con=f.createQueueConnection(); con.start(); //2) create Queue session QueueSession ses=con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Queue object Queue t=(Queue)ctx.lookup('myQueue'); //4)create QueueReceiver QueueReceiver receiver=ses.createReceiver(t); //5) create listener object MyListener listener=new MyListener(); //6) register the listener object with receiver receiver.setMessageListener(listener); System.out.println('Receiver1 is ready, waiting for messages...'); System.out.println('press Ctrl+c to shutdown...'); while(true){ Thread.sleep(1000); } }catch(Exception e){System.out.println(e);} } } 
Fil: MyListener.java
 import javax.jms.*; public class MyListener implements MessageListener { public void onMessage(Message m) { try{ TextMessage msg=(TextMessage)m; System.out.println('following message is received:'+msg.getText()); }catch(JMSException e){System.out.println(e);} } } 

Kjør Mottaker-klassen først og deretter Sender-klassen.


JMS-emneeksempel

Det er det samme som JMS Queue, men du må endre kø til emne, avsender til utgiver og mottaker til abonnent.

Du må opprette 2 navngitte JNDI myTopicConnectionFactory og mitt emne .

Fil: MySender.java
 import java.io.BufferedReader; import java.io.InputStreamReader; import javax.naming.*; import javax.jms.*; public class MySender { public static void main(String[] args) { try { //Create and start connection InitialContext ctx=new InitialContext(); TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup('myTopicConnectionFactory'); TopicConnection con=f.createTopicConnection(); con.start(); //2) create queue session TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Topic object Topic t=(Topic)ctx.lookup('myTopic'); //4)create TopicPublisher object TopicPublisher publisher=ses.createPublisher(t); //5) create TextMessage object TextMessage msg=ses.createTextMessage(); //6) write message BufferedReader b=new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.println('Enter Msg, end to terminate:'); String s=b.readLine(); if (s.equals('end')) break; msg.setText(s); //7) send message publisher.publish(msg); System.out.println('Message successfully sent.'); } //8) connection close con.close(); }catch(Exception e){System.out.println(e);} } } 
Fil: MyReceiver.java
 import javax.jms.*; import javax.naming.InitialContext; public class MyReceiver { public static void main(String[] args) { try { //1) Create and start connection InitialContext ctx=new InitialContext(); TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup('myTopicConnectionFactory'); TopicConnection con=f.createTopicConnection(); con.start(); //2) create topic session TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Topic object Topic t=(Topic)ctx.lookup('myTopic'); //4)create TopicSubscriber TopicSubscriber receiver=ses.createSubscriber(t); //5) create listener object MyListener listener=new MyListener(); //6) register the listener object with subscriber receiver.setMessageListener(listener); System.out.println('Subscriber1 is ready, waiting for messages...'); System.out.println('press Ctrl+c to shutdown...'); while(true){ Thread.sleep(1000); } }catch(Exception e){System.out.println(e);} } } 
Fil: MyListener.java
 import javax.jms.*; public class MyListener implements MessageListener { public void onMessage(Message m) { try{ TextMessage msg=(TextMessage)m; System.out.println('following message is received:'+msg.getText()); }catch(JMSException e){System.out.println(e);} } }