O Serviço de Mensagem Java (do Inglês Java Message Service) é uma API, parte da especificação JEE, permitindo criar, enviar, receber e ler mensagens. Quando uma chamada para um sistema é feito, normalmente invocamos uma funcionalidade e, o sistema que está efetuando esta chamada, fica esperando o processamento ocorrer. Ou seja, que chama acaba aguardando que o destino processe e retorne informações. Este tipo de chamada é conhecida como chamada síncrona ou bloqueante, pois não o chamador não pode fazer nada até que a resposta chegue.
Uma grande vantagem de utilizar mensagens é o fato de que o sistema coloca uma mensagem numa recipiente e não espera que ela seja processada. Desta forma alguma outra rotina irá ler a mensagem, enquanto ela é processada a rotina que colocou, inicialmente, a mensagem fica livre para executar outras atividades. Depois de algum tempo uma resposta será colocada em outro recipiente, que pode ser lido a qualquer momento. Este tipo de requisição é chamado de assíncrono ou não bloqueante. Pois que faz a chamada não espera pela resposta e pode processar outra coisa. Veja imagem abaixo com as diferenças:
Figura 1 (clique para ampliar)
Este sistema de mensagem (JMS) suporta dois modelos de troca de mensagens: Ponto-a-ponto (ou modelo de filas) e Publish/subscribe. Esta é a arquitetura de um JMS:
Figura 2 (clique para ampliar)
Toda troca de mensagem inicia pela busca de um Connection Factory, através do seu JNDI. É através do Connection Factory que será criada uma conexão, que, por sua vez, cria uma sessão. Ela tem um papel muito importante, pois é a sessão quem cria uma mensagem, um produtor/publicador ou consumidor/assinante. Através de um JNDI uma mensagem pode ser enviar ou recebida para uma fila ou tópico.
O JMS não está restrito à linguagem Java, como é um processo padronizado, qualquer linguagem ou sistema que obedece ao padrão pode trocar mensagens com sistemas Java.