logo

Tutorial JMS

JMS (Java Message Service) es una API que proporciona la posibilidad de crear, enviar y leer mensajes. Proporciona comunicación débilmente acoplada, confiable y asincrónica.

algoritmo para rsa

JMS también se conoce como servicio de mensajería.


Comprender la mensajería

La mensajería es una técnica para comunicar aplicaciones o componentes de software.

JMS se utiliza principalmente para enviar y recibir mensajes de una aplicación a otra.


Requisito de JMS

Generalmente, el usuario envía un mensaje a la aplicación. Pero, si queremos enviar mensajes de una aplicación a otra, necesitamos usar la API JMS.

Considere un escenario en el que una aplicación A se ejecuta en INDIA y otra aplicación B se ejecuta en EE. UU. Para enviar un mensaje desde una aplicación a B, necesitamos usar JMS.


Ventaja de JMS

1) Asincrónico: Para recibir el mensaje, el cliente no necesita enviar una solicitud. El mensaje llegará automáticamente al cliente.

2) Confiable: Proporciona seguridad de que el mensaje se entrega.


Dominios de mensajería

Hay dos tipos de dominios de mensajería en JMS.

  1. Dominio de mensajería punto a punto
  2. Dominio de mensajería del editor/suscriptor

1) Dominio de mensajería punto a punto (PTP)

En el modelo PTP, se envía un mensaje. entregado a un receptor solo. Aquí, Cola Se utiliza como middleware orientado a mensajes (MOM).

La cola es responsable de retener el mensaje hasta que el receptor esté listo.

En el modelo PTP, hay sin dependencia del tiempo entre emisor y receptor.


2) Dominio de mensajería del editor/suscriptor (Pub/Sub)

En el modelo Pub/Sub, se muestra un mensaje. entregado a todos los suscriptores . Es como una radiodifusión. Aquí, Tema se utiliza como un middleware orientado a mensajes que es responsable de retener y entregar mensajes.

En el modelo PTP, hay dependencia del tiempo entre editor y suscriptor.



Modelo de programación JMS


Ejemplo de cola JMS

Para desarrollar un ejemplo de cola JMS, debe instalar cualquier servidor de aplicaciones. Aquí estamos usando pez de cristal3 servidor donde estamos creando dos JNDI.

  1. Crear una fábrica de conexiones llamada miQueueConnectionFactory
  2. Crear recurso de destino llamado miCola

Después de crear JNDI, cree la aplicación de servidor y receptor. Debe ejecutar el servidor y el receptor en una consola diferente. Aquí, estamos usando eclipse IDE, se abre en una consola diferente de forma predeterminada.

1) Crear fábrica de conexiones y recurso de destino.

Abra la consola de administración del servidor mediante la URL http://localhost:4848

Inicie sesión con el nombre de usuario y contraseña.

Clickea en el Recurso JMS -> Fábricas de conexiones -> Nuevo , ahora escriba el nombre del grupo y seleccione el tipo de recurso como QueueConnectionFactory y luego haga clic en el botón Aceptar.

Clickea en el Recurso JMS -> Recursos de destino -> Nuevo , ahora escriba el nombre JNDI y el nombre del destino físico y luego haga clic en el botón Aceptar.

2) Crear una aplicación de remitente y receptor

Veamos el código del remitente y del receptor. Tenga en cuenta que el receptor está adjunto al oyente que se invocará cuando el usuario envíe un mensaje.

Archivo: 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);} } } 
Archivo: MiReceptor.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);} } } 
Archivo: 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);} } } 

Ejecute primero la clase Receptor y luego la clase Remitente.


Ejemplo de tema JMS

Es lo mismo que la cola JMS, pero debe cambiar la cola a tema, el remitente a editor y el receptor a suscriptor.

Necesitas crear 2 JNDI llamados miTopicConnectionFactory y mi tema .

Archivo: 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);} } } 
Archivo: MiReceptor.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);} } } 
Archivo: 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);} } }