Mio Mi Blog

un blog de un ubuntero… para ubunteros =)

11. JMS

Publicado por velorek en Junio 7, 2007

¿Que es JMS?

Servicio de Mensajes Java.En las comunicaciones cliente servidor, los datos que se intercambian entre las dos partes necesitan de una comunicación sincrona, es decir, que las dos partes esten presentes en el momento de la comunicación. Los sistemas de mensajes aportan una serie de mejoras a la comunicación entre aplicaciones que no tienen por que residir en la misma máquina.

JMS se situa como middleware en medio de la comunicación de dos aplicaciones. En entornos cliente servidor, cuando la aplicación A quiere comunicarse con la Aplicación B, necesita saber donde esta B (su IP por ejemplo) y que B esté escuchando en ese momento. Cuando se usa un sistema de mensajes, la aplicación A envía un mensaje, el sistema de mensajes lo recibe y se lo envía a B cuando se conecte al servicio. De esta manera se consigue una comunicación asíncrona entre A y B, es decir no hace falta que B esté presente en el momento del envío del mensaje, y no por ello va a dejar de recibirlo.

Arquitectura de JMS

Una aplicación JMS consta de los siguientes elementos:

Clientes JMS Aplicaciones que envian o reciben mensajes a través de JMS
Mensajes Los mensajes que se intercambian
Objetos administrados Los objetos JMS a los que se dirigen las comunicaciones
  • Objetos administrados

Los objetos administrados son el punto al que se comunican los clientes JMS para enviar o recibir mensajes, se denominan objetos administrados por que los crea el administrador. Implementan las interfaces JMS y se sitúan en el espacio de nombres de JNDIpara que los clientes puedan solicitarlos.

Hay dos tipos de objetos administrados en JMS:

ConectionFactory: Se usa para crear una conexión al proveedor del sistema de mensajes.

Destination: Son los destinos de los mensajes que se envían y el recipiente de los mensajes que se reciben.

  • Mensajes

Es el corazón del sistema de mensajes. Estan formados por tres elementos:

Header: Es la cabecera del mensaje, contiene una serie de campos que le sirven a los clientes y proveedores a identificar a los mensajes.

Properties: Son propiedades personalizadas para un mensaje en particular.

Body: Es el mensaje en si, hay distintos tipos:

StreamMessage:Contiene un stream de datos que se escriben y leen de manera secuencial.
MapMessage: Contiene pares nombre-valor.
TextMessage: Contiene un String.
ObjectMessage: Contiene un objeto que implemente la interfaz Serializable.
BytesMessage: Contiene un stream de bytes.

Clientes JMS

Son clientes de JMS tanto el que suministra mensajes como el que los recibe. Todos tienen una serie de pasos en común antes de lograr enviar o recibir un mensaje:

  • Conseguir un objeto ConnectionFactory a través de JNDI.
  • Conseguir un destino, mediante el objeto Destination a través de JNDI.
  • Usar ConnectionFactory para conseguir un objeto Connection
  • Usar Destination para crear un objeto Session.

Aplicaciones punto a punto

En las conexiones punto a punto, es decir, con solo dos extremos en la comunicación, el que envía y el que recibe, el destino en el que se reciben los mensajes enviados y de donde se recogen los mensajes recibidos recibe el nombre de Cola de mensajes (en inglés Queue) y actúa como una cola FIFO (el primer mensaje que llega es el primer mensaje que se recoge).

Vamos a seguir los pasos que necesita un cliente JMS para conseguir una conexión a una cola de mensajes.

  • Primero debemos crear un contexto inicial para JNDI:

InitialContext contextoInicial = new InitialContext();

  • Recuperamos de este contexto el objeto QueueConnectionFactory
   QueueConnectionFactory factory =
               (QueueConnectionFactory)contextoInicial.lookup("QueueConnectionFactory");
  • Recuperamos de la JNDI la cola de mensajes
   Queue cola = (Queue)contextoInicial.lookup("Cola");
  • Mediante el metodo createQueueConnection() de factory conseguimos un objeto QueueConnection.
   QueueConnection conexion = factory.createQueueConnection();
  • El objeto anterior nos sirve ahora para crear una sesión, los parámetros los comentaremos mas tarde:
   QueueSession sesion =
               conexion.createQueueSession(false,sesion.AUTO_ACKNOWLEDGE);

A partir de ahora ya podriamos crear mensajes y enviarlos. Vamos a ver un ejemplo sencillo de una comunicación punto a punto.

Ejemplo de una comunicación punto a punto

Para poder probar los ejemplos, necesitamos tener instalada la J2EE 1.3 o superior (es donde viene la api JMS, en el paquete javax.jms) y el classpath debe incluir a j2ee.jar. Esto será requisito previo para la compilación y ejecución de todos los ejemplos.

Antes de compilar y ejecutar los ejemplos, debemos crear los objetos administrados que usaremos en los ejemplos:

  • Ejecutamos el servidor J2EE: j2ee -verbose
  • Entre el montón de mensajes que imprime, divisamos QueueConnectionFactory, es el ConnectionFactory por defecto.
  • Crearemos un destino para nuestros mensajes: j2eeadmin -addJmsDestination Cola queue
  • Esto crea un Destination llamado Cola del tipo queue, comprobamos que esta creado: j2eeadmin -listJmsDestination

Esta es la clase que envía mensajes a la cola Envia Cola [ver codigo]

mn

Escribe un comentario

Debes ser Sesión como para publicar un comentario.