Enviando Mensagens Assíncronas Via JMS no Grails usando Spring


Bom, alguns dias atrás fiquei um tempinho estudando como enviar mensagens assíncronas via JMS no grails. Instalei o plugin jms mas não fiquei satisfeito com os resultados. Então resolvi entender como o Spring poderia me ajudar a resolver esse problema.

Acredito que, com o passar das pesquisas, o caro leitor já está por dentro de como funciona toda a arquitetura por trás do JMS. Mas, para refrescar a cabeça, segue abaixo um diagrama com o escopo geral do que realmente deve ser criado para que o envio/recepção de mensagens funcione:

Componentes da Arquitetura JMS

Componentes da Arquitetura JMS

Para mais informações sobre o escopo e funcionalidade de cada um desses componentes, acesse este link para ir diretamente à pagina do produto.

Voltando ao assunto. Como o Grails tem suas bases no Spring, usaremos o mesmo para fazer o controle de injeção de dependências de todos esses componentes.

A solução é simples e robusta! Vamos aos passos:

1. Configurar os beans:

O Spring pode injetar as dependências que eu necessitar para que eu não me preocupe com configurações de contexto para criação de toda aquela arquitetura JMS. Usando ActiveMQ, criaremos dois beans: um responsável pela criação da ConnectionFactory e outro que disponibilizará um JmsTemplate que facilitará o trabalho de envio das mensagens.

No arquivo [project.home]/grails-app/conf/resources.groovy (onde project.home é a pasta raiz do seu projeto Grails) inclua a seguinte configuração dos beans:

beans = {
    connectionFactory(org.apache.activemq.pool.PooledConnectionFactory) {bean ->
        bean.destroyMethod = "stop"
        connectionFactory = {org.apache.activemq.ActiveMQConnectionFactory cf ->
            brokerURL = "vm://localhost:8180"
        }
    }
    jmsTemplate(org.springframework.jms.core.JmsTemplate) {
        connectionFactory = ref(connectionFactory)
    }
    postProcessMessage(br.com.mydomain.processor.MyMessagePreProcessor) {
        userID = ""
    }
}

2. Download das dependências

Para esse problema, devemos fazer download de alguns pacotes. O principal é o Apache ActiveMQ que pode ser baixado nesse link.

Na versão 5.2.0 do ActiveMQ, a classe:

org.apache.activemq.pool.PooledConnectionFactory

(utilizada para criar o ConnectionFactory) não foi implementada. Nesse caso, faça o download do pacote nesse link.

Após a fase de download estiver acabada, instale as dependências no seu projeto Grails, colocando-as na pasta lib do projeto.

3. Implementando Métodos Publishers

Para enviar mensagens via JMS, podemos usar agora o pacote que a Spring disponibiliza para tratar esse tipo de comunicaçã. O método consiste em utilizar injeção de dependência para instanciar todos os componentes básicos para o envio de mensagens via JMS. São eles: ConnectionFactory, Destination, Topic, Session, entre outros. Então vejamos o seguinte excerto de código.

MyMessagePreProcessor postProcessMessage
public def notifyNewMessage(MyMessage message, List<User> users) {
   try {
      users.each {User user ->
         postProcessMessage.userID = user.id
         jmsTemplate.convertAndSend("caixaDeEntradaTopic", item, postProcessMessage)
      }
   } catch (Exception e) {
      log.error("Sending updates failed.", e)
   }
}

Ficou supimpa? Faltou algo? Alguma coisa não ficou clara? Utilize um espaço reservado somente pra você: os comentários 🙂 Obrigado

Links Relacionados

http://blog.devnull.org/2008/08/25/extended-jms-configuration-with-grails-plugin/

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s