- Simplifica el conocimiento de mensajeria empresarial que debe tener un programador de Java para desarrollar aplicaciones de mensajería.
- La comunicación es débilmente acoplada, es decir, un componente envía un mensaje a un destino y el receptor lo recoge de aquel destino.
- Ni el emisor ni el receptor tiene que estar disponibles al mismo tiempo de la comunicación (independencia y asíncronia).
- Permite portabilidad entre las diferentes implementaciones de proveedores JMS.
- JMS no se considera un MOM, más bien, abstrae la interacción entre clientes de mensajería y los MOMs.
Tipos de Modelos de Mensajería
Existen dos modelos de mensajería:
Punto a Punto (PTP): el mensaje se consume por un único consumidor.
Publicación/Subscripción (Pub/Sub): el mensaje es consumido por muchos consumidores.
¿Comó funciona JMS?
Está compuesta por los siguientes componentes:
- Cliente JMS: una aplicación en java que envía y recibe mensajes JMS.
- Productor JMS: es un cliente que crea y envía mensajes JMS.
- Consumidor JMS: es un cliente que recibe y procesas los mensajes JMS.
- Proveedor JMS: implementación de los interfaces JMS, el proveedor se encarga de la administración y control de los recursos JMS.
- Mensaje JMS: objeto compuesto por cabecera, propiedades y cuerpo, él cual contiene información y es enviado y recibido por clientes JMS.
- Dominio JMS: se denomina a los modelos de envía de mensajes: pear to pear y publicador/subscriptores.
- Objetos administrativos: objetos de JMS preconfigurados que contienen datos de configuración específicos del proveedor, estos son utilizados por los clientes.
Objetos Administrativos
Los clientes acceden a estos objetos mediante JNDI (Java Naming and Dictory Interface), está interfaz es una API para servicios de directorios y permite a los clientes descubrir y buscar objetos y datos a través de un nombre. Los objetos se clasifican en:
- Factoría de conexión: permite crear conexiones con el proveedor JMS.
- Destino: objeto del tipo cola/tópico al cual se direccionan y envían los mensajes, y desde donde también se reciben los mensajes.
Estos objetos son mantenidos mediante administración, es decir, no es necesaria la programación, mas bien, se configura dependiendo del tipo de proveedor de JMS, la administración de estos objetos se realiza dentro de un espacio de nombre de JNDI.
Los clientes acceden a estos objetos mediante interfaces que inyectan recursos a los clientes.
Factorías de Conexión
Objeto utilizado por el cliente para crear una conexión con el proveedor. Contiene un conjunto de parámetros de configuración de conexión, los cuales previamente han sido definidos por el administrador del servidor.
Cada factoría es una instancia de ConnectionFactory pudiendo ser QueueConnectionFactory o TopicConnectionFactory
Factoría común:
@Resource(mappedName="jms/ConnectionFactory")
private static ConnectionFactory connectionFactory;
Factorías especificas:
@Resource(mappedName="jms/QueueConnectionFactory")
private static QueueConnectionFactory queueConnectionFactory;
@Resource(mappedName="jms/TopicConnectionFactory")
private static TopicConnectionFactory topicConnectionFactory;
Destinos
Es el objeto que usa el cliente para especificar el destino de los mensajes que produce y el origen de los mensajes que consume. PTP los destinos son las colas(javax.jms.Queue), mientras que en Pub/Sub son los tópicos(javax.jms.Topic).
Cola y Tópico
@Resource(mappedName="jms/Queue")
private static Queue queue;
@Resource(mappedName="jms/Topic")
private static Topic topic;
Modelo de Programación JMS
Conexiones
Una conexión encapsula una conexión virtual con el proveedor JMS. Al crear una conexión, se crean objetos de parte del cliente y del servidor.
Mediante una conexión se pueden crear una o más sesiones en las cuales se producen y consumen los mensajes.
Las conexiones implementan la interfaz.
javax.jms.Connection
Creanción de conexiones:
Connection connection = connectionFactory.createConnection();
QueueConnection queueConnection = queueConnectionFactory.createQueueConnection();
TopicConnection topicConnection = topicConnectionFactory.createTopicConnection();
Antes de consumir mensajes se debe llamar al método start de la conexión.
Al finalizar la aplicación se debe cerrar la conexión para evitar sobrecarga del proveedor JMS.
conection.close();
Al cerrar una conexión también se cierran sus sesiones y productores y consumidores de mensajes.
Sesiones
Una sesión es un contexto monohilo para producir y consumir mensajes, mediante sesiones se crean
- Productores de mensajes.
- Consumidores de mensajes.
- Mensajes.
- Navegadores de colas.
- Colas y tópicos temporales.
Existen dos tipos de sesiones:
- Transaccionales: no es necesario enviar acuse de recibo.
- No-transaccionales: hay que elegir un tipo de acuse de recibo.
Creación sessión transaccional
Session session = connection.createSession(true, 0);
Creación sessión no-transaccional
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
;
Productores de Mensajes
- Un productor de mensajes es un objeto creado por una sesión y se utiliza para enviar mensajes a un destino.
- Implementa la interfaz javax.jms.MessageProducer .
A partir de la sesión y un destino se pueden crear diferentes tipos de productores.
MessageProducer producerD = session.createProducer(dest);
MessageProducer producerQ = session.createProducer(queue);
MessageProducer producerT = session.createProducer(topic);
;
Productores específicos
QueueSender sender = queueSession.createSender(queue);
TopicPublisher publisher = topicSession.createPublisher(topic);
Para enviar mensajes se utiliza el método
send.
producer.send(message);
Consumidores de Mensajes
- Un consumidor de mensajes es un objeto creado por una sesión y que es utilizado para recibir mensajes enviados desde un destino.
- Implementa la interfaz javax.jms.MessageConsumer.
Usando la sesión y el destino se pueden crear diferentes tipos de productores.
MessageConsumer consumer = session.createConsumer(dest);
MessageConsumer consumer = session.createConsumer(queue);
MessageConsumer consumer = session.createConsumer(topic);
Consumidores específicos
QueueReceiver receiver = queueSession.createReceiver(queue);
TopicSubscriber subscriber = topicSession.createSubscriber(topic);
Luego de crear un consumidor, éste queda activo y se puede utilizar para recibir mensajes.
Para consumir de forma sincrónica utilizar el método receive.
connection.start();
Message m = consumer.receive();
connection.start();
Message m = consumer.receive(1000); // timeout tras un seg
Listener de Mensajes
- Es un objeto queonsumer = session.createConsumer(d actúa como un manejador de eventos asíncronicos para mensajes.
- Implemente la interfaz javax.jms.MessageListener, el cual solo posee el método onMessage, este método permite definir las acciones a realizar cuando un mensajes es recibido.
Para registrar el listener se utiliza el método
setMessageListener del interfaz MessageConsumer.
MiListener myListener = new MiListener();
consumer.setMessageListener(myListener);
Mensajes
Son creados a partir de objetos de sesión.
TextMessage message = session.createTextMessage();
Un mensaje contiene tres componentes: los campos de la cabecera, las propiedades especificas de la aplicación y el cuerpo del mensaje.
Pasos de una aplicación JMS
- Adquirir una factoría de conexión.
- Crear una conexión mediante la factoría de conexión.
- Comenzar la conexión.
- Crear una sesión a partir de la conexión.
- Adquirir un destino.
- Dependiendo si se envía o se recibe.
- Crea un productor
- Crea un productor.
- Crea un mensaje y lo adjunta a su destino.
- Crea un consumidor
- Crea un consumidor.
- Opcionalmente registrar un listener de mensajes.
- Enviar/Recibir mensajes.
- Cerrar los objetos (consumidor, productor, sesión, conexión)
Código
Referencias