JMS

Mensageria não é um bicho de 7 cabeças # 2

Postado em Atualizado em

activemq-5-x-box-reflectionNo último post Mensageria não é um bicho de 7 cabeças # 1, eu te ensinei a como integrar um serviço completo de MOM de forma simples e rápida para qualquer solução java standalone. Hoje eu vou dar continuidade no assunto, te ensinando a ativar os 4 serviços mais básicos indispensáveis que vão deixar sua solução com aquela cara de “produto de integração profissional” MOM de grande porte. Aperte os cintos e venha comigo:

1.Pooling de Fila

É  muito comum em integrações usando MOM que as filas tenham um pooling de objetos mínimos e máximo, com o objetivo de dar uma boa vazão no consumo das mensagens simultâneas, em caso de acumulo e alta demanda. Para ativar esse serviço em nossa solução, use a propriedade concurrency na configuração do consumidor da fila. Segue abaixo um exemplo:

1

No exemplo acima estamos configurando um listener de fila que conterá um pooling de mínimo 3 e máximo 8 objetos que serão responsáveis por consumir simultaneamente a demanda dessa fila. Isso você deve ajustar conforme a demanda prevista da suposta fila. O próprio spring controlara o pooling em caso de ociosidade e ou aumento de demanda. Fácil de mais, que chega a ser sem graça 😉 !

2.Persistência de Mensagens

Uma solução MOM profissional que se preze deve persistir as mensagens em banco de dados para que em caso de downtime, exista 100% de segurança e garantia de entrega de mensagens na volta do serviço. Como estamos trabalhando com soluções java standalone, a opção é persistir a fila no mesmo banco de dados da própria solução. Graças a integração plena entre Spring e o ActiveMQ, temos  como configurar o MOM para gravar as mensagens no mesmo DataSource no qual a solução Spring esta pendurada. Para ativar esse serviço, é necessario setar propriedade persistent como true na definição do broker local, configurar um bean adaptador de persistência que liga o MOM no DataSource do Spring. Segue abaixo um exemplo:

1

Acima temos o primeiro bean spring de DataSource básico utilizada na solução. Logo após temos o segundo bean de adapter que a faz a ligação da persistência do ActiveMQ  para um banco de dados definido pelo DataSource. Esse é o segredo ai da integração do MOM com o Spring. E por fim, temos o ultimo bean do broker que se integra ao adptador de banco de dados. Interessante pontuar a propriedade createTablesOnStartup que fara o adaptador gerar os scripts de banco de dado do MOM de forma automático na start do contexto do spring. Quando os produtos trabalham em conjunto, tudo fica mais fácil!

3.Fila Transacional

As mensagens agora sendo gravadas dentro de um banco de dados, muda totalmente de figura a questão de consistência. A solução precisa então integrar seu contexto transacional com o MOM, de forma a garantir que em caso de “commit” ou “rooback” de processos, as mensagens e o consumo da fila sejam também “comitadas” ou “descartadas” seguindo o fluxo global. Para ativar esse serviço, o spring oferece o já conhecido JmsTransactionManager que gerencia a integração de transações para MOM. Segue o exemplo abaixo:

1

Acima temos o primeiro bean que ativa o broker já passado no primeiro post do artigo, tendo o segundo bean o foco da questão que é o que ativa a transação para o serviço de JMS. Importante pontuar: como a persistência do MOM já esta sendo configurada para o usar o DataSource da solução, assim sendo, o bean spring que controla a transação dessa solução, também estará automaticamente configurado para controlar a transação das operações do MOM no banco de dados configurado pelo DataSource. Este bean gerenciador da transação eu deixei de fora, podendo ser qualquer um dos vários tipos existente no spring.

4.Politica de Retry

E para fechar com chave de ouro, devemos também configurar qual sera a politica de retry em caso de falhas de consumo de fila. Ou seja, caso ocorra exceptions na processamento da fila, o que seu MOM deve fazer? Basicamente é criar uma politica de retentivas e ou até descarte da mensagem. Para ativar esse serviço configure um bean RedeliveryPolicy que declara qual sera o comportamento para a tal fila. Segue o exemplo abaixo:

1

Acima temos o bean definindo a seguinte politica: caso ocorrer erro de processamento da fila, aguarde 10 segundos e tente novamente. Em caso de erros, continue tentado de 1 em 1 minutos. O maximumRedeliveries -1 indica que é para fazer retry de forma infinita até processar com sucesso. Você poderia usar numero 3, indicando que se deseja tentar no máximo 3 x e depois deletar a mensagem. Veja na imagem do item 3, a configuração da connectionFactory que recebe a politica da fila.

Conclusão Final

E assim, com mais 5 minutos, e mais algumas poucas linhas de configuração spring, você consegue ativar os serviços de pooling, persistência, transação e politicas de retry, deixando sua solução Java + ActiveMQ + Spring JMS 100% profissional para suportar contextos de integrações de alta qualidade, performance e segurança.

Aonde eu uso isso?

Precisou integrar sua solução java com e-mail?, web services soap? web services rest?, banco de dados legados? ou quer gerar um relatório pesado assíncrono? Esta ai seu ponto de partido. ActiveMQ + Spring JMS = Solução simples e rápida com todos os sabores de processamento assíncrono usando filas e tópicos 100% MOM.

Como eu aprendo mais sobre esse assunto?

Tudo isso e muito mais pode ser encontrado no livro ActiveMQ in Action. Excelente livro sobre conceitos de mensageria, JMS e integrações em geral. Boa leitura para todos 😉 .

“Meus queridos amigos, todas essas promessas são para nós. Por isso purifiquemos a nós mesmos de tudo o que torna impuro o nosso corpo e a nossa alma. E, temendo a Deus, vivamos uma vida completamente dedicada a ele.” 2 Coríntios 7:1

Mensageria não é um bicho de 7 cabeças # 1

Postado em Atualizado em

activemq-5-x-box-reflectionVocê já ouviu falar de MOM?

Message oriented middleware (MOM) é servidor de aplicação (infra-estrutura de software + hardware) idealizado exclusivamente para suportar o envio e recebimento de mensagens entre sistemas distribuídos. É um serviço utilizado para intermediar a troca de mensagens entre sistemas, com o objetivo de fazer integração de serviços.

Para que serve um MOM?

Serve para dar solução robusta e confiável na integração entre duas ou mais diferentes soluções. Integrar sistemas hoje é um desafio imenso, diferentes plataformas, diferentes tecnologias, diferentes protocolos, diferentes mecanismos de persistências, assim, se faz necessario garantir serviços dentro da solução de integração como por exemplo: desacoplamento, entrega de mensagem, persistência de mensagem, politicas de retry, processamento assíncrono, escalabilidade, confiabilidade, transação, interrupções, segurança, clusterização e muito etc. Um MOM já faz tudo isso e muito mais.

MOM é para ser utilizado em soluções de grande porte?

Essa é justamente meu ponto: você lendo tal definição, tem a falsa impressão que só usaria um MOM para fazer coisas gigantescas e exorbitantes!!! Mas depois de conhecer Apache ActiveMQ e Spring JMS, você vera que é muito fácil e pode usar para fazer coisas pequenas também. Como diria um amigo meu, “só na manteguinha….. 🙂 “.

Você já ouviu falar de ActiveMQ?

ActiveMQ é uma implementação de um middleware completo (MOM), open source e grátis. Ele possui todas as grandes features necessários para dar solução em coisas de “grande porte”, mas o que o pessoal desconhece é que ele tem um arquitetura tão flexível e é tão bem feito que oferece diversas opções de uso e configurações flexíveis. Umas delas é usar o serviço de MOM de forma “embarcada”, dentro da sua própria instancia da JVM e da solução, não precisando criar um servidor remoto exclusivo para isso. Juntamente com isso, você desabilita as chamadas remotas e questões de persistência, e assim, acaba ficando com um mini-serviço de MOM simples, local com suporte a filas(Queue) e tópicos (Topics) que é justamente a “cereja de bolo” desse tipo de serviço.

Você já ouviu falar de Spring JMS?

Spring JMS é kit de desenvolvimento arquitetural que faz parte do framework spring criado exclusivamente para se trabalhar com integração de sistemas usando MOM. Esse produto abstrai toda a infra-estrutura de código utilizada para programar esse tipo de solução, criando uma facade de serviços rápida, produtiva e fácil de usar, retirando a necessidade de fazer código sujo e infraestrutural (boilepart) necessário para se configurar, enviar e consumir mensagens de um MOM.

Vamos fazer um exemplo prático?

Segue abaixo um exemplo real dessa simples e robusta solução:

Ferramentas:

  • Maven
  • Eclipse Java EE IDE for Web Developers – Versão Neon.1
  • Groovy-Eclipse plugin

Projeto:

Segue os passos resumido do projeto:

Crie um projeto java maven: New project -> Maven Project. Adicione groovy no projeto: botão direto no projeto -> configure -> Convert to groovy project. Configure o pom para baixar as dependências básicas: groovy, spring, cdi e activemq:

1

Configurar o spring.xml, subindo o activemq local, sem persistência, sem jmx, sem chamada remota. Configurar uma fila simples e um listener de fila. Configuramos também um jmsTemplate que é a facade de serviços spring que esconde a código sujo de MOM e JMS.

2

Criar um bean que envia a mensagem da fila:

2

Criar um bean que consome as mensagens da fila:

3

Fazer uma classe simples com main para testar o envio e o consumo da mensagem:

3

Execute a solução e teremos a saída:

3

E assim, com  menos de 5 minutos, e poucas linhas de código você consegue embarcar e reusar um MOM completo fazendo filas, tópicos, sem persistência, sem chamada remota, sem gastar muita memoria, rápido, fácil e sem perder tempo fazendo na unha qualquer coisa do tipo. Sem contar que você pode evoluir mais esse produto, habilitando serviço por serviço, tudo de acordo com sua necessidade.

Aonde eu uso isso?

Precisou integrar sua solução java com e-mail?, web services soap? web services rest?, banco de dados legados? ou quer gerar um relatório pesado assíncrono? Esta ai seu ponto de partido. ActiveMQ + Spring JMS = Solução simples e rápida com todos os sabores de processamento assíncrono usando filas e tópicos 100% MOM.

Como eu aprendo mais sobre esse assunto?

Tudo isso e muito mais pode ser encontrado no livro ActiveMQ in Action. Excelente livro sobre conceitos de mensageria, JMS e integrações em geral. Boa leitura para todos 😉 .

“Mas tu, ó SENHOR, me proteges como um escudo. Tu me dás a vitória e renovas a minha coragem.” Salmos 3:3