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.
- Domini de missatgeria punt a punt
- 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.
- Crea una fàbrica de connexions anomenada myQueueConnectionFactory
- 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.javaimport 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.javaimport 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);} } }