# JMS

Java Message Service, ou JMS, é uma API da linguagem Java para middleware orientado a mensagens. Através da API JMS, duas ou mais aplicações podem se comunicar por mensagens.

## Arquitetura

A API JMS suporta dois modelos de troca de mensagens:
* ponto a ponto ou modelo de filas
* modelo publish/subscribe

### Modelo ponto a ponto

No modelo ponto a ponto, ou por filas, um "produtor" (producer) envia mensagens para uma fila e um "consumidor" (consumer) as lê. Neste caso, o produtor conhece o destino da mensagem e a envia diretamente para a fila do consumidor. Este modelo é caracterizado pelo seguinte:
* apenas um consumidor irá ler a mensagem;
* não é necessário que o produtor esteja em execução no momento em que o consumidor lê a mensagem, assim como não é necessário que o consumidor esteja em execução no momento que o produtor envia a mensagem;
* quando lê uma mensagem com sucesso o consumidor envia um aviso (acknowledged) para o produtor.

### Modelo publish/subscribe

Este modelo suporta a publicação de mensagens para um determinado tópico de mensagens (message topic). O(s) "assinante(s)" (subscriber) podem registrar interesse em receber ("em assinar") mensagens de um tópico. Neste modelo, nem o "publicador" (publisher) ou o "assinante" sabem um do outro. As características deste modelo são:
* múltiplos consumidores podem ler a mensagem;
* existe uma dependência temporal entre os publicadores e assinantes de um tópico. Um publicador deve criar uma "assinatura" (subscription) para que os assinantes possam receber mensagens. O assinante do tópico deve estar em execução continuamente para receber as mensagens.

## Elementos da API JMS
### Cliente JMS

Uma aplicação ou objeto Java que produz e consome mensagens. As mensagens são objetos que contém os dados que são transferidos entre os clientes JMS.

### Conexão JMS

A partir do momento que uma factory é obtida, conexões para o provedor JMS podem ser criadas. Uma conexão representa a ligação entre a aplicação cliente e a aplicação servidora. Dependendo do tipo da conexão, ela permitirá que os clientes criem sessões para o envio e recebimento de mensagens de filas ou tópicos.

### Factory de conexões JMS

É um objeto administrado que a aplicação cliente utiliza para a criação de conexões para o provedor JMS. Normalmente, os clientes obtém as factories através de interfaces portáveis, desta forma, mesmo se as configurações do provedor JMS mudarem, o código do cliente permanece inalterado. Os administradores mantém as configurações em objetos (objetos da classe factory), que são obtidos através de buscas (lookup) na JNDI. Dependendo do tipo da mensagem, o cliente obterá uma factory para tópico ou para fila.

### Destino

É um objeto administrado que encapsula a identidade do destino das mensagens, que é onde as mensagens são enviadas e consumidas. Pode ser uma fila ou um tópico. O administrador JMS cria estes objetos, e os usuários os obtém através de buscas na JNDI. Da mesma forma que as factories de conexões, o administrador pode criar dois tipos de classe de destino, fila e tópico.

### Consumidor

Um objeto criado através de uma sessão JMS. Ele recebe mensagens de um destino. O consumidor pode receber mensagens de maneira síncrona ou assíncrona de filas ou tópicos.

### Produtor

Um objeto criado através de uma sessão JMS. Ele envia mensagens para um destino.

### Mensagens

São objetos enviados entre consumidores e produtores de mensagens. Eles contêm um outro objeto que encapsula os dados que serão trafegados pelas mensagens. Uma mensagem possui três partes principais:
* um cabeçalho, contém a rota das mensagens
* um conjunto de atributos opcionais
* o corpo da mensagem que pode conter cinco tipos de mensagens: texto, map, bytes, stream ou objetos
A interface de uma mensagem é extremamente flexível e permite várias formas de customização de conteúdo.

### Provedor JMS

Representa uma interface para um software de middleware orientado à mensagens. Ele suporta a interface JMS que é especificada pela Sun Microsystems. Ele é basicamente um adaptador de um middleware.

### Software que suportam JMS

Para que uma aplicação possa utilizar JMS, deve haver um provedor que possa gerenciar as sessões e filas. Existem opções comerciais e livres. Dentre as opções livres temos:
* ActiveMQ
* JBossMQ
* HornetQ
* Joram
* MantaRay
* OpenJMS
* RabbitMQ
Soluções comerciais incluem:
* BEA WebLogic Server da BEA Systems (Acquired by Oracle Corporation in 2008)
* Tibco EMS da TIBCO Software
* FioranoMQ
* GigaSpaces da GigaSpaces Technologies
* iBus da Softwired
* IONA JMS da IONA Technologies
* SeeBeyond ICAN Suite da Sun Microsystems
* IQManager da Sun Microsystems
* JMS+ da webMethods
* SonicMQ da Sonic Software
* WebSphere MQ da IBM
* webMethods Broker JMS da webMethods