logo

Tutorial JMS

JMS (Java Message Service) és una API que proporciona la facilitat per crear, enviar i llegir missatges. Proporciona una comunicació poc acoblada, fiable i asíncrona.

Funció prototip de c++

JMS també es coneix com a servei de missatgeria.


Comprensió de la missatgeria

La missatgeria és una tècnica per comunicar aplicacions o components de programari.

JMS s'utilitza principalment per enviar i rebre missatges d'una aplicació a una altra.


Requisit de JMS

En general, l'usuari envia un missatge a l'aplicació. Però, si volem enviar missatges d'una aplicació a una altra, hem d'utilitzar l'API JMS.

Considereu un escenari, una aplicació A s'està executant a l'Índia i una altra aplicació B s'està executant als EUA. Per enviar missatges des de l'aplicació A a B, hem d'utilitzar JMS.


Avantatge de JMS

1) asíncron: Per rebre el missatge, el client no ha d'enviar la sol·licitud. El missatge arribarà automàticament al client.

2) Fiable: Proporciona la seguretat que el missatge s'entrega.


Dominis de missatgeria

Hi ha dos tipus de dominis de missatgeria a JMS.

  1. Domini de missatgeria punt a punt
  2. Domini de missatgeria de l'editor/subscriptor

1) Domini de missatgeria punt a punt (PTP).

En el model PTP, un missatge és lliurat a un receptor només. Aquí, Cua s'utilitza com a programari intermediari orientat a missatges (MOM).

La cua és responsable de mantenir el missatge fins que el receptor estigui preparat.

En el model PTP, hi ha sense dependència del temps entre emissor i receptor.


2) Domini de missatgeria de l'editor/subscriptor (Pub/Sub).

Al model Pub/Sub, un missatge és lliurat a tots els subscriptors . És com una emissió. Aquí, Tema s'utilitza com a programari intermediari orientat a missatges que s'encarrega de mantenir i lliurar missatges.

En el model PTP, hi ha dependència temporal entre editor i subscriptor.



Model de programació JMS


Exemple de cua JMS

Per desenvolupar un exemple de cua JMS, cal instal·lar qualsevol servidor d'aplicacions. Aquí, estem utilitzant peix de vidre 3 servidor on estem creant dos JNDI.

  1. Crea una fàbrica de connexions anomenada myQueueConnectionFactory
  2. Crea el recurs de destinació anomenat myQueue

Després de crear JNDI, creeu l'aplicació de servidor i receptor. Heu d'executar el servidor i el receptor en una consola diferent. Aquí, estem utilitzant l'IDE d'eclipse, s'obre en una consola diferent per defecte.

1) Creeu una fàbrica de connexió i un recurs de destinació

Obriu la consola d'administració del servidor per l'URL http://localhost:4848

Inicieu sessió amb el nom d'usuari i la contrasenya.

Feu clic a Recurs JMS -> Fàbriques de connexió -> Nou , ara escriviu el nom del grup i seleccioneu el tipus de recurs com a QueueConnectionFactory i feu clic al botó d'acord.

Feu clic a Recurs JMS -> Recursos de destinació -> Nou , ara escriviu el nom JNDI i el nom físic de la destinació i feu clic al botó d'acord.

2) Creeu una aplicació d'emissor i receptor

Vegem el codi de l'emissor i el receptor. Tingueu en compte que el receptor s'adjunta amb un oient que s'invocarà quan l'usuari enviï un missatge.

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

Executeu primer la classe Receptor i després la classe Remitent.


Exemple de tema JMS

És el mateix que la cua JMS, però heu de canviar la cua a tema, remitent a editor i receptor a subscriptor.

Heu de crear 2 JNDI anomenats myTopicConnectionFactory i myTopic .

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