Java Messaging System (JMS)

Introdução
Este artigo descreve somente os detalhes do JMS (Java Messaging System) que é apenas uma implementação de um MOM (Message-oriented Middleware). Ou seja, para detalhes a respeito de comunicação entre aplicações ou módulos heterogêneos, deve ser consultado o artigo Message-oriented Middleware (MOM).

Motivação

 * Infra-estrutura de suporte ao envio de mensagens através de sistemas distribuídos - Message-oriented Middleware (MOM) - para aplicações dentro da arquitetura J2EE (ou JEE);
 * Possibilidade de envio de mensagens a sistemas heterogêneos, independente da tecnologia ou linguagem utilizadas;
 * Redução da complexidade de se desenvolver sistemas que se adaptam a diversos protocolos de rede ou de comuniação;

Especificação
O JMS (Java Messaging System) foi desenvolvido como parte da da JEE (Java Enterprise Edition) sob a JSR 914 que permite o envio, recebimento, criação, etc, de mensagens através de sistemas distribuídos (MOM).

Objetivos e vantagens do JMS
É necessário destacar três características que a especificação do JMS provê como mais importantes e que não se relacionam somente ao Java: Além dos três objetivos citados acima, tem-se como vantagens na abordagem de troca de mensagens:
 * Loose coupling (baixo acoplamento): aplicações que atendem a este requisito possuem módulos com pouco, ou nenhum conhecimento a respeito da implementação de outros módulos, e, geralmente se comunicam através de interfaces públicas. No contexto do JMS, os módulos passam a se comunicar através de mensagens, somente.
 * Confiabilidade;
 * Assíncronismo: comunicação pode ocorrer mesmo que o cliente e servidor não estejam disponíveis ao mesmo tempo;
 * Integração de plataformas heterogêneas: uma aplicação em Java consegue se comunicar com uma aplicação em .NET através de mensagens. Se esta for migrada para PHP, por exemplo, não é necessário alteração alguma na primeira aplicação pois só interessa à ela saber para onde deve enviar a mensagem;
 * Reduzir gargalos no sistema;
 * Aumentar a escalabilidade (graças ao baixo acoplamento);
 * Melhorar o tempo de resposta à mudanças (graças ao baixo acoplamento);

Diferenças entre JMS e RMI/CORBA
É comum confundir as características do JMS com as de comunicação com RMI ou CORBA, mas a principal diferença de se deve guardar é que JSM troca mensagens em forma de eventos mediados por um broker enquanto RMI/CORBA se comunicam com chamadas a eventos remotos. Ou seja, em JMS utiliza-se interfaces genéricas de um broker enquanto no RMI/CORBA um cliente conhece, pelo menos, as interfaces públicas do outro (acoplamento baixo, mas existe).

A imagem ao lado foi obtida em http://www.argonavis.com.br/cursos/java/j530/j530_9_JMS.pdf.

Principais componentes do JMS

 * JMS provider: implementação das interfaces obrigatórias de um MOM. Isto é, especificações de MOM's (Message-oriented Middleware) prevêm assinaturas que qualquer cliente deve implementar e o provider é nada mais que um conjunto de classes desenvolvidas em Java que fornecem implementações à essas interfaces;


 * JMS client: é a aplicação que cria e recebe mensagens;
 * JMS producer/publisher;
 * JMS consumer/subscriber;
 * JMS message: objeto de mensagem contendo dados que trafegam entre clientes JMS;
 * JMS queue: é uma área contendo mensagens que foram enviadas e que aguardam por serem lidas. Seu nome (queue - fila) não deve ser interpretado ao pé-da-letra, isto é, as mensagens não necessariamente são lidas na ordem que uma fila propõe; seu objetivo é garantir que uma mensagem enviada é lida somente uma vez;
 * JMS topic: mecanismo de publicação de mensagens para múltiplos leitores;

Implementando com JMS
Para utilizar o JMS é necessário um fornecedor que implementa os aspectos da especificação JMS, por exemplo, o JBoss Messaging, que é o fornecedor JMS padrão do servidor de aplicações JBoss Application Server.

O exemplo abaixo ilustra como criar um produtor de mensagens para que clientes possam se inscrever no serviço de recebimento de mensagens: //ponto-a-ponto QueueSender sender = queueSession.createSender(fila); sender.send( message );

//pub/sub TopicPublisher publisher = topicSession.createPublisher(canal); publisher.publish( message );

Questões de concurso
A levar por questões que já caíram em concursos passados, JMS não é cobrado a fundo, e sim como conceito, mesmo porque JMS não é uma implementação de um mecanismo de envio e recebimento de mensagens, mas sim uma especificação, isto é, o JMS dita as regras para os fornecedores de implementação adotar.

A questão abaixo foi retirada da prova para Arquiteto de Sistemas (FGV - 2009):

A respeito das tecnologias Java/J2EE, assinale a alternativa correta.


 * a) JSF é uma especificação feita pela Sun que visa padronizar o uso de transações distribuídas feitas por aplicativos Java.


 * b) JTA é uma API da linguagem Java que permite a componentes baseados em Java/J2EE criar, enviar, receber e ler mensagens.


 * c) JPA é uma tecnologia utilizada no desenvolvimento de aplicações para Web, similar às tecnologias Active Server Pages (ASP) da Microsoft ou PHP.


 * d) JMS é um framework para desenvolver aplicações web de forma ágil, permite que o desenvolvedor crie UIs através de um conjunto de componentes UIs pré-definidos.


 * e) EJB é uma arquitetura de componentes multi-plataforma para o desenvolvimento de aplicações Java Enterprise Edition (Java EE), multicamadas, distribuídas, escaláveis e orientadas a objetos.

Reparem que a descrição de JMS na verdade está na letra b): "é uma API da linguagem Java que permite a componentes baseados em Java/J2EE criar, enviar, receber e ler mensagens". Neste exemplo acima a resposta correta era a e).

Referências

 * http://en.wikipedia.org/wiki/Java_Message_Service#cite_note-JSR914-0
 * http://en.wikipedia.org/wiki/JBoss_Messaging
 * http://en.wikipedia.org/wiki/Message_Oriented_Middleware
 * http://www.argonavis.com.br/cursos/java/j530/j530_9_JMS.pdf
 * http://www.questoesdeconcursos.com.br/questoes/6f28511a-9b