Java Message Service (JMS)

QueueEn este Post se habla hacer de la especificación de JMS, los patronos de entrega de manejes que soporta como lo son Punto a Punto(P2P) y Publicador/Suscriptor. También hablare sobre los Temas y Colas (Topis and Queues) y los diferentes tipos de suscriptores que soporta la implementación de JMS.

Java Message Service es una especificación de la Java Community Process(JRS 914) la cual fue desarrollada originalmente para permitir a las aplicaciones Java comunicarse con los proveedores MOM o Middleware Orientado a Mensajes la cual buscaba los siguientes objetivos:

  • Brindas un mecanismo de enrutamiento y entrega de mensajes.
  • Entrega fiable de mensajes
  • Soportar los patronos de entrega de mensajes Punto a Punto(P2P) y Publicador/Subscriptor (P/S)
  • Brindar un mecanismo asíncrono de entrega de mensajes.

En el mercado podemos encontrar diferentes proveedores de JMS los cuales se encuentran embebidos en los principales Application Server como el caso de WebSphere, Wildfly, WebLogic, Glassfish, entre otros, sin embargo todos trabajan bajo el mismo estándar lo que permite que la comunicación entre ellos sea totalmente compatible.

La siguiente imagen muestra como JMS permite que las aplicaciones se pueden comunicar por medio de JMS.ArchJMS

Fig.1: Muestra el proceso por el cual las aplicaciones se comunican a través de JMS.

Aunque JMS es un potente proveedor de Mensajería requiere de la configuración de Colas o Temas para poder depositar lo mensajes de entrada.

Tanto las colas como los temas son muy utilizados en los ambientes distribuidos donde se requerimos una comunicación asíncrona o One Wey(Solo ida) entre los distintos componentes que conforman nuestra infraestructura sin embargo estos se diferencias de los servicios web debido a que los mensajes son colocados en Cola o Temas para luego ser distribuidos a los destinatarios por lo que cambia un poco la forma en que los mensajes son administrados.

Estructura de un mensaje JMS

Al igual que todo protocolo de comunicación los mensajes JMS tiene una Taxonomía la cual se debe de respetar para que los mensajes sea enviados y respondidos de forma correcta.Los mensajes JMS tiene la siguiente estructura:

Header

El Header o cabecera es la parte que contiene todas las propiedades que son necesarias para JMS pueda operar y procesar lo mensajes de forma correcta, Es en esta sección donde es establece el identificador de la conversación(CorrelationID ),Fecha de expiración(Expiration),Tipo de mensaje(Type), Destino al cual deberán responder el mensaje(ReplyTo) y muchas mas las cuales puedes encontrar en la pagina de Oracle.

Body

Esta sección tiene el PayLoad o carga útil la cual representa el mensaje que queremos enviar, Este mensajes puede ser una Map, Texto plano, XML, un Objeto Java, O un Stream o incluso un mensaje personalizado. Lo importante es que esta sección contiene lo que realmente queremos comunicar al destinatario.

 

Una vez explicado a grandes rasgos podemos pasar a explicar que son las Colas(Queue) y Temas(Topics).

Colas (Queue)

Las colas son las mas utilizadas ya que los mensajes van dirigidos a un único receptor por lo cual, cuando un cliente se conecta a JMS y solicita el mensaje este es entregado pero es eliminado de la Cola por lo que si otra cliente busca el mensaje ya no lo encontrara. Este patrón es conocido como Punto a Punto(P2P)

Te invito a ver mi artículo Estructura de datos Queue para aprender más acerca de las colas.

Estructura de datos – Queue (Cola)

En este tipo mensajes hay que tener un cierto cuidad a la hora de solicitar los mensajes ya que si recuperamos un mensaje equivocado el destinatario real ya no lo podrá recibir y pero a un , El remitente jamas recibirá su respuesta.(JMS Permite tener varios clientes solicitando mensajes a la misma Cola)

Queue

Fig.2: Como podemos apreciar en la imagen al único que se le entrega el mensaje  es aquel al que fue dirigido y las demas aplicaciones no son notificadas.

Cuando utilizar Colas:

Las colas son utilices cuando queremos enviar un mensaje a un destinataria único para ser procesado, un ejemplo seria mandar una solicitud de crédito al sistema de crédito(por ponerle un nombre). o simplemente para desacoplar dos sistemas los cuales no queremos que se conozcan sin embargo lo único que conocen los dos es el formato en que se tendrá que hacer la comunicación ( Aquí explico esto )

Temas(Topics)

Por otra parte tenemos lo temas los cuales trabajan de una forma distinta que las Colas pues estos a diferencia de que el mensaje solo es entregado a un único receptor lo Temas pueden enviar el mensaje a Todos los clientes que estén suscritos al Tema de esta manera los Temas(Topics) Siguen el patrón de Publicador/Subscriptor.

Topic

Fig.3: Como podemos apreciar todos los suscriptores que estén suscritos al Tema(Topic) recibirán una copia del mensaje.

Cuando utilizar Temas(Topic)

Los Temas son buenos cuando queremos notificar o compartir información a múltiples destinatarios. Por ejemplo, Si tu estas suscrito a mi blog, Cada vez que yo publique un nuevo Post seras notificado por correo electrónico junto con todos los demas que estén suscritos, esto no es precisamente JMS pero es un ejemplo de donde mas de un destinatario reciben la misma notificación.

¿Crees que JMS juega un papel importante en Java o crees que es una herramienta fácilmente sustituida por otras cosas?

 

*Recuerda que si te gusto este artículo, compártelo y suscribete al blog para recibir todas las actualizaciones por medio de tu correo electrónico.

5 thoughts to “Java Message Service (JMS)”

  1. Hola

    veo que este post es del 2014, consulta ¿esta tecnologia se deberia considerar antigua?
    ¿hay tecnologia de intregracion mas nuevas?

    lo pregunto por que tengo que integrar 2 sistemas en java ¿que me recomiendas?

    gracias
    saludos

    1. Hola Ricardo,

      La integración con aplicaciones por medio de mensajes (Queue o Topics) sigue siendo hasta la fecha una solución basta buena y robusta, pero más alla de si es antigua o no, es necesario entender que tipo de integración requieres para tus aplicaciones. la integración por medio de mensajes como es el caso de JMS, es muy buena para desacoplar las dependencias entre aplicaciones, al mismo tiempo que permite una alta tolerancia a fallos, pues no importa si la aplicación destino este o no activa al momento de envías el mensaje, pues este lo recibirá en cuanto esté disponible, de la misma forma, es importante entender que este tipo de comunicación es Asíncrona.

      Por otra parte, existe otros medios de integración como lo son los servicios REST o SOAP, del cual tengo un tutorial para implemenetar API de cada uno y la diferencia entre estas dos tecnologías.

  2. hola Oscar, gracias por tu respuesta, otra consulta, que pasa si cuando se esta ejecutando/procesando un mensaje y este presenta un error y se cae, donde se pueden visualizan los errores para poder corregirlo mas adelante

    saludos

    1. Dependiendo el error puede hacer varias cosas, si es un error reprocesable, lo puedes mantente en la Queue para que se procese nuevamente más adelante, si es un error no recuperable, entonces tendrás que sacar el mensaje y notificar a los usuario para que realizasen alguna tarea. Como tal, JMS no tiene un visor de errores, en tal caso lo tendrás que desarrollar por tu cuenta.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *