logo

JMS-zelfstudie

JMS (Java Message Service) is een API die de mogelijkheid biedt om berichten te maken, verzenden en lezen. Het biedt losjes gekoppelde, betrouwbare en asynchrone communicatie.

np.uniek

JMS wordt ook wel een berichtenservice genoemd.


Berichten begrijpen

Messaging is een techniek om applicaties of softwarecomponenten te communiceren.

JMS wordt voornamelijk gebruikt om berichten van de ene applicatie naar de andere te verzenden en ontvangen.


Vereiste van JMS

Over het algemeen stuurt de gebruiker een bericht naar de applicatie. Maar als we berichten van de ene applicatie naar de andere willen sturen, moeten we de JMS API gebruiken.

Beschouw een scenario waarbij één applicatie A draait in INDIA en een andere applicatie B draait in de VS. Om berichten van A-applicatie naar B te verzenden, moeten we JMS gebruiken.


Voordeel van JMS

1) Asynchroon: Om het bericht te ontvangen, hoeft de klant geen verzoek te verzenden. Het bericht komt automatisch bij de klant aan.

2) Betrouwbaar: Het biedt zekerheid dat de boodschap wordt afgeleverd.


Berichtendomeinen

Er zijn twee typen berichtendomeinen in JMS.

  1. Point-to-Point-berichtendomein
  2. Berichtendomein van uitgever/abonnee

1) Point-to-Point (PTP) berichtendomein

In het PTP-model is één bericht afgeleverd bij één ontvanger alleen. Hier, Wachtrij wordt gebruikt als berichtgeoriënteerde middleware (MOM).

De wachtrij is verantwoordelijk voor het vasthouden van het bericht totdat de ontvanger gereed is.

In het PTP-model is dat wel het geval geen timingafhankelijkheid tussen zender en ontvanger.


2) Berichtendomein van uitgever/abonnee (Pub/Sub).

In het Pub/Sub-model is er één bericht aan alle abonnees bezorgd . Het is net als met uitzenden. Hier, Onderwerp wordt gebruikt als berichtgeoriënteerde middleware die verantwoordelijk is voor het vasthouden en bezorgen van berichten.

In het PTP-model is dat wel het geval timing afhankelijkheid tussen uitgever en abonnee.



JMS-programmeermodel


Voorbeeld van JMS-wachtrij

Om bijvoorbeeld een JMS-wachtrij te ontwikkelen, moet u een applicatieserver installeren. Hier gebruiken we glasvis3 server waar we twee JNDI.

  1. Maak een verbindingsfabriek met de naam myQueueConnectionFactory
  2. Maak een doelresource met de naam mijnWachtrij

Nadat u JNDI hebt gemaakt, maakt u een server- en ontvangertoepassing. U moet de server en ontvanger in verschillende consoles gebruiken. Hier gebruiken we Eclipse IDE, deze wordt standaard in een andere console geopend.

1) Maak een verbindingsfabriek en bestemmingsbron

Open de serverbeheerdersconsole via de URL http://localhost:4848

Log in met de gebruikersnaam en het wachtwoord.

Klik op de JMS Resource -> Verbindingsfabrieken -> Nieuw , schrijf nu de naam van de pool en selecteer het resourcetype als QueueConnectionFactory en klik vervolgens op de knop OK.

Klik op de JMS-bron -> Bestemmingsbronnen -> Nieuw , schrijf nu de JNDI-naam en de naam van de fysieke bestemming en klik vervolgens op de knop OK.

2) Maak een zender- en ontvangerapplicatie

Laten we de afzender- en ontvangercode bekijken. Houd er rekening mee dat de ontvanger is gekoppeld aan een luisteraar die wordt aangeroepen wanneer de gebruiker een bericht verzendt.

Bestand: 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);} } } 
Bestand: MijnReceiver.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);} } } 
Bestand: 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);} } } 

Voer eerst de klasse Receiver uit en vervolgens de klasse Sender.


JMS-onderwerpvoorbeeld

Het is hetzelfde als JMS Queue, maar u moet de wachtrij wijzigen in Onderwerp, Afzender in Uitgever en Ontvanger in Abonnee.

U moet 2 JNDI met de naam maken mijnTopicConnectionFactory En mijn onderwerp .

Bestand: 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);} } } 
Bestand: MijnReceiver.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);} } } 
Bestand: 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);} } }