# Java Message Service

La API Java Message Service (en español servicio de mensajes Java), también conocida por sus siglas JMS, es la solución creada por Sun Microsystems para el uso de colas de mensajes. Este es un estándar de mensajería que permite a los componentes de aplicaciones basados en la plataforma Java2 crear, enviar, recibir y leer mensajes. También hace posible la comunicación confiable de manera asíncrona.
El servicio de mensajería instantánea también es conocido como Middleware Orientado a Mensajes (MOM por sus siglas en inglés) y es una herramienta universalmente reconocida para la construcción de aplicaciones empresariales.
Dicha API es parte integral de la versión 2 de Java.
Existen dos modelos de la API JMS, los cuales son:
Modelo Punto a Punto (point to point) (P2P): Este modelo cuenta con solo dos clientes, uno que envía el mensaje y otro que lo recibe. Este modelo asegura la llegada del mensaje ya que si el receptor no está disponible para aceptar el mensaje o atenderlo, de cualquier forma se le envía el mensaje y este se agrega en una cola del tipo FIFO para luego ser recibido según haya entrado
Modelo Publicador/Suscriptor (Publish/subscribe): Este modelo cuenta con varios clientes, unos que publican temas o eventos, y los que ven estos temas, a diferencia del modelo punto a punto este modelo tiende a tener más de un consumidor.
Ambos modelos pueden ser síncronos mediante el método receive y asíncronos por medio de un MessageListener.

## Implementación

Para enviar o recibir mensajes los clientes tienen que conectarse por medio de los objetos administrados, este nombre lo reciben porque son creados por el administrador (j2eeadmin). Estos implementan las interfaces JMS y se sitúan en el espacio de nombres JNDI (Java Naming and Directory Interface) para que así los clientes puedan solicitarlos.
Hay dos tipos de objetos administrados en JMS:
* ConnectionFactory: 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 receptor de los mensajes que se reciben.
Mensajes:
Estos son la base de los JMS, se componen de tres elementos.
1.Header: Es la cabecera del mensaje, le sirve a los clientes y a los proveedores para poder identificarlos.
2.Properties: Son propiedades en general para personalizar y/o hacer más específico un mensaje.
3.Body: Es el mensaje en sí mismo, hay varios tipos de “cuerpos” que puede llevar un mensaje:
* StreamMessage: Contiene un flujo (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 todos aquellos que envíen mensajes, como aquellos que los reciban, en algunos textos a los que envían mensajes son llamados proveedores y los que reciben consumidores o clientes. Para enviar o recibir mensajes tienen que tener una serie de pasos :
1.Conseguir un destino, mediante el objeto Destination a través de JNDI.
2.Usar ConnectionFactory para conseguir un objeto Connection.
3.Usar Destination para crear un objeto Session.

## Ejemplos de sistemas comerciales de cola de mensajes

* WebSphere MQ de IBM (antes MQ*Series)
* Message Queue de Microsoft (MSMQ)
* Java Message Service de Sun (JMS)
* Data Distribution Service del OMG (DDS)
* Enterprise Message Service de WTF (EMS)
* Amazon Simple Queue Service de Amazon Web Services (SQS)