JMS (Java Message Service) es una API que ofrece la posibilidad de crear, enviar y leer mensajes. Proporciona comunicación asincrónica, confiable y poco acoplada.
JMS también se conoce como servicio de mensajería.
Comprensión de 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 un mensaje de una aplicación a otra, necesitamos usar la API JMS.
Considere un escenario, una aplicación A se está ejecutando en INDIA y otra aplicación B se está ejecutando en EE. UU. Para enviar un mensaje de una aplicación a B, necesitamos usar JMS.
Ventaja de JMS
1) Asincrónico: Para recibir el mensaje, no se requiere que el cliente envíe una solicitud. El mensaje llegará automáticamente al cliente.
2) De confianza: Proporciona la seguridad de que se entrega el mensaje.
Dominios de mensajería
Hay dos tipos de dominios de mensajería en JMS.
- Dominio de mensajería punto a punto
- Dominio de mensajería del editor / suscriptor
1) Dominio de mensajería punto a punto (PTP)
En el modelo PTP, un mensaje es entregado a un receptor solamente. 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 el remitente y el receptor.
2) Dominio de mensajería de editor / suscriptor (Pub / Sub)
En el modelo Pub / Sub, un mensaje es 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 glassfish3 servidor donde estamos creando dos JNDI.
- Crear fábrica de conexiones con el nombre myQueueConnectionFactory
- Crear recurso de destino llamado myQueue
Después de crear JNDI, cree la aplicación de servidor y receptor. Necesita 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 una fábrica de conexiones y un recurso de destino.
Abra la consola de administración del servidor por la URL http: // localhost: 4848
Inicie sesión con el nombre de usuario y la 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 destinatario
Veamos el código de remitente y receptor. Tenga en cuenta que Receiver se adjunta con el oyente que se invocará cuando el usuario envíe un mensaje.
Archivo: MySender.java
import java.io.BufferedReader; import java.io.InputStreamReader; importar javax.naming. *; importar javax.jms. *; public class MySender {public static void main (String[] args) {try {// Crear e iniciar la conexión InitialContext ctx = new InitialContext (); QueueConnectionFactory f = (QueueConnectionFactory) ctx.lookup («myQueueConnectionFactory»); QueueConnection con = f.createQueueConnection (); con.start (); // 2) crear una sesión de cola QueueSession ses = con.createQueueSession (false, Session.AUTO_ACKNOWLEDGE); // 3) obtener el objeto Queue Queue t = (Queue) ctx.lookup («myQueue»); // 4) crea el objeto QueueSender QueueSender sender = ses.createSender
Archivo: MyReceiver.java
importar javax.jms. *; import javax.naming.InitialContext; public class MyReceiver {public static void main (String[] args) {try {// 1) Crear e iniciar la conexión InitialContext ctx = new InitialContext (); QueueConnectionFactory f = (QueueConnectionFactory) ctx.lookup («myQueueConnectionFactory»); QueueConnection con = f.createQueueConnection (); con.start (); // 2) crear sesión de cola QueueSession ses = con.createQueueSession (false, Session.AUTO_ACKNOWLEDGE); // 3) obtener el objeto Queue Queue t = (Queue) ctx.lookup («myQueue»); // 4) crear QueueReceiver QueueReceiver receiver = ses.createReceiver
Archivo: MyListener.java
importar javax.jms. *; La clase pública MyListener implementa MessageListener {public void onMessage (Message m) {try {TextMessage msg = (TextMessage) m; System.out.println («se recibe el siguiente mensaje:» + msg.getText ()); } catch (JMSException e) {System.out.println (e);}}}
Ejecute la clase Receiver primero y luego la clase Sender.
Ejemplo de tema de JMS
Es lo mismo que la cola JMS, pero debe cambiar Cola a tema, Remitente a publicador y Receptor a suscriptor.
Necesita crear 2 JNDI con nombre myTopicConnectionFactory y mi tema.
Archivo: MySender.java
import java.io.BufferedReader; import java.io.InputStreamReader; importar javax.naming. *; importar javax.jms. *; public class MySender {public static void main (String[] args) {try {// Crear e iniciar la conexión InitialContext ctx = new InitialContext (); TopicConnectionFactory f = (TopicConnectionFactory) ctx.lookup («myTopicConnectionFactory»); TopicConnection con = f.createTopicConnection (); con.start (); // 2) crear sesión en cola TopicSession ses = con.createTopicSession (false, Session.AUTO_ACKNOWLEDGE); // 3) obtener el objeto Tema Tema t = (Tema) ctx.lookup («myTopic»); // 4) crear el objeto TopicPublisher TopicPublisher publisher = ses.createPublisher
Archivo: MyReceiver.java
importar javax.jms. *; import javax.naming.InitialContext; public class MyReceiver {public static void main (String[] args) {try {// 1) Crear e iniciar la conexión InitialContext ctx = new InitialContext (); TopicConnectionFactory f = (TopicConnectionFactory) ctx.lookup («myTopicConnectionFactory»); TopicConnection con = f.createTopicConnection (); con.start (); // 2) crear sesión de tema TopicSession ses = con.createTopicSession (false, Session.AUTO_ACKNOWLEDGE); // 3) obtener el objeto Tema Tema t = (Tema) ctx.lookup («myTopic»); // 4) crear TopicSubscriber TopicSubscriber receiver = ses.createSubscriber
Archivo: MyListener.java
importar javax.jms. *; La clase pública MyListener implementa MessageListener {public void onMessage (Message m) {try {TextMessage msg = (TextMessage) m; System.out.println («se recibe el siguiente mensaje:» + msg.getText ()); } catch (JMSException e) {System.out.println (e);}}}