logo

JMS tutorial

JMS (Java Message Service) er en API, der giver mulighed for at oprette, sende og læse beskeder. Det giver løst koblet, pålidelig og asynkron kommunikation.

python ny linje

JMS er også kendt som en beskedtjeneste.


Forstå beskeder

Messaging er en teknik til at kommunikere applikationer eller softwarekomponenter.

JMS bruges hovedsageligt til at sende og modtage beskeder fra en applikation til en anden.


Krav til JMS

Generelt sender brugeren besked til applikationen. Men hvis vi vil sende beskeder fra en applikation til en anden, skal vi bruge JMS API.

Overvej et scenario, en applikation A kører i INDIEN og en anden applikation B kører i USA. For at sende besked fra A-applikation til B, skal vi bruge JMS.


Fordel ved JMS

1) Asynkron: For at modtage beskeden er klienten ikke forpligtet til at sende anmodning. Beskeden kommer automatisk til klienten.

2) Pålidelig: Det giver sikkerhed for, at beskeden bliver leveret.


Meddelelsesdomæner

Der er to typer meddelelsesdomæner i JMS.

  1. Punkt-til-punkt-meddelelsesdomæne
  2. Udgiver-/abonnentmeddelelsesdomæne

1) Point-to-Point (PTP) meddelelsesdomæne

I PTP-modellen er én besked leveret til én modtager kun. Her, bruges som en meddelelsesorienteret middleware (MOM).

Køen er ansvarlig for at holde beskeden, indtil modtageren er klar.

I PTP-modellen er der ingen tidsafhængighed mellem afsender og modtager.


2) Udgiver/Abonnent (Pub/Sub) meddelelsesdomæne

I Pub/Sub-modellen er én besked leveret til alle abonnenter . Det er ligesom at sende. Her, Emne bruges som en meddelelsesorienteret middleware, der er ansvarlig for at opbevare og levere meddelelser.

I PTP-modellen er der timing afhængighed mellem udgiver og abonnent.



JMS programmeringsmodel


Eksempel på JMS-kø

For at udvikle JMS-køeksempel skal du installere en hvilken som helst applikationsserver. Her bruger vi glasfisk 3 server, hvor vi opretter to JNDI.

  1. Opret forbindelse fabrik navngivet myQueueConnectionFactory
  2. Opret destinationsressource navngivet min Kø

Efter oprettelse af JNDI skal du oprette server- og modtagerapplikation. Du skal køre server og modtager i en anden konsol. Her bruger vi eclipse IDE, den åbnes i en anden konsol som standard.

1) Opret forbindelsesfabrik og destinationsressource

Åbn serveradministrationskonsollen ved hjælp af URL'en http://localhost:4848

Log ind med brugernavn og adgangskode.

Klik på JMS-ressource -> Forbindelsesfabrikker -> Nyt , skriv nu poolnavnet og vælg ressourcetypen som QueueConnectionFactory og klik derefter på knappen ok.

Klik på JMS-ressource -> Destinationsressourcer -> Ny , skriv nu JNDI-navnet og det fysiske destinationsnavn og klik derefter på knappen OK.

2) Opret afsender- og modtagerapplikation

Lad os se afsender- og modtagerkoden. Bemærk, at modtageren er knyttet til lytteren, som vil blive aktiveret, når brugeren sender besked.

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);} } } 

Kør først modtagerklassen og derefter afsenderklassen.


JMS-emneeksempel

Det er det samme som JMS Queue, men du skal ændre kø til emne, afsender til udgiver og modtager til abonnent.

Du skal oprette 2 JNDI navngivne myTopicConnectionFactory og mit 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);} } }