Resource Adapter do ActiveMQ para JBoss

Neste post vou mostrar como trabalhar com JMS dentro do JBoss AS mas usando o ActiveMQ, para tal tarefa é necessário um Resource Adapter. O JBoss AS 5 tem como provider de messageria padrão o JBoss Messaging, vou mostrar como se configura o servidor de aplicação para acessar o broker de messageria de Apache o ActiveMQ.

Para isso vamos utilizar as seguintes versões dos softwares:
  • JDK 6 update 20
  • JBoss AS jboss-5.1.0.GA
  • Apache ActiveMQ 5.3.2
Uma vez que você tenha baixadoos 3 podemos proceguir. Extraia o ActiveMQ em algum diretório de sua máquina e criei um variável de ambiente apontando para o local da instalação, esta variavel deve se chamar $ACTIVEMQ_HOME, você deve fazer o mesmo procedimento para o JBoss AS mas a váriavel de ambiente deve se chamar $JBOSS_HOME. Estou assumindo que você já instalou o JDK 6 do java e criou a váriavél de ambiente para o $JAVA_HOME.



Instalando o Resource Adapter no JBossAS

Vá para o diretório $ACVTIVEMQ_HOME/lib/optional e procure pelo arquivo chamado activemq-rar-5.3.2.rar este é o resource adapter que estou falando. Agora vamos instalar o arquivo em algum profile do JBoss, você pode criar o seu proprio profile ou colocar dentro de algum existente, pois bem eu vou usar o profile *default*.

Se posicione em $JBOSS_HOME/server/default/deploy e crie o seguinte diretório activemq-ra.rar , neste diretório você deve extrair todo o conteudo do arquivo activemq-rar-5.3.2.rar. Uma vez que você tenha feito este processo o Resource Adaptar já vai estar instalando. Agora é necessário realizar algumas configurações para que você consiga acessar o seu ActiveMQ de forma correta.

Configurando o acesso ao Broker

Para realizarmos esta tarefa é necessário abrir o seguinte arquivo $JBOSS_HOME/server/default/deploy/activemq-ra.rar/META-INF/ra.xml edite o arquivo no seu editor de texto preferido. Dentro do arquivo você precisa procurar pelo nodo chamado resourceadapter e depois por config-property e config-property-value, conforme esta no xml a baixo.

<br>    <resourceadapter><br>        <resourceadapter-class>org.apache.activemq.ra.ActiveMQResourceAdapter</resourceadapter-class><br>        <config-property><br>            <description><br>              The URL to the ActiveMQ server that you want this connection to connect to.  If using<br>              an embedded broker, this value should be 'vm://localhost'.<br>            </description><br>            <config-property-name>ServerUrl</config-property-name><br>            <config-property-type>java.lang.String</config-property-type><br>            <config-property-value>tcp://localhost:61616</config-property-value><br><!--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <config-property-value>vm://localhost</config-property-value> --><br>        </config-property><br>

Perceba que o url de acesso ao broker é tcp://localhost:61616 isto indica que estamos usando o broker sobre o protocolo tcp na porta 61616 esta é a porta e o protocolo padrão de transporte do ActiveMQ, você pode mudar esta configuração se quizer.

Desta forma a configuração esta pronta, você pode começar a consumir e receber mensagem dentro do JMS usando o novo resource adapter do ActiveMQ, para isso será necessário utilizar algumas anotações do JBoss.

Recebendo mensagem Assincronas em um MDB

Agora vamos criar um MDB para receber mensagems usando o Resource Adapter. Primeiro vamos ao código e depois eu explico os elementos chave, confiram a baixo:

</p><p>package com.blogspot.diegopacheco.messageria;<br><br>import javax.ejb.ActivationConfigProperty;<br>import javax.ejb.MessageDriven;<br>import javax.ejb.TransactionAttribute;<br>import javax.ejb.TransactionAttributeType;<br>import javax.ejb.TransactionManagement;<br>import javax.ejb.TransactionManagementType;<br>import javax.jms.Message;<br>import javax.jms.MessageListener;<br>import javax.jms.TextMessage;<br><br>import org.jboss.ejb3.annotation.Pool;<br>import org.jboss.ejb3.annotation.ResourceAdapter;<br>import org.jboss.ejb3.annotation.defaults.PoolDefaults;<br><br>/**<br> * <br> * @author Diego Pacheco<br> *<br> */<br>@MessageDriven(activationConfig = {<br>        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),<br>        @ActivationConfigProperty(propertyName = "destination", propertyValue = "fila_pacheco"),<br>        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })<br>@ResourceAdapter("activemq-ra.rar")<br>@Pool(value=PoolDefaults.POOL_IMPLEMENTATION_STRICTMAX,maxSize=10)<br>@TransactionManagement(TransactionManagementType.BEAN)<br>@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)<br>public class Carteiro implements MessageListener {<br><br>    public void onMessage(Message msg) {<br>        System.out.println("Mensagem chegou aqui! ");<br>        try{<br>            if (msg instanceof TextMessage){<br>                System.out.println("TextMessage: " + ((TextMessage)msg).getText());<br>            }<br>        }catch(Exception e){<br>            e.printStackTrace();<br>        }<br>    }        <br>} </p><p>

Esta classe em cima é um EJB, mas é um especial do tipo Message Driven Bean ou simplesmente MDB, um MDB é uma forma de um EJB receber mensagems de forma assincrona de dentro do container EJB. Isso é bom por que desta forma podemos deixar o JBoss gerenciar as threads e controlar melhor o consumo de mensagems.

Para ser um MDB precisamos implementar a interface MessageListener e implementar o método onMessage, além disso é necessário atréz de anotações informar que tipo de recurso sera consumido pelo MDB, por exemplo de ser um Topico ou uma Fila.

Vamos as anotações do código a cima. Existe a anotação @MessageDriven com 3 subanotações chamadas @ActivationConfigProperty que configuram o consumo de mensagems, estas anotações são anotações são padrão da jee, servem para dizer que vamos utilizar um fila(queue) e o nome do recurso no caso fila_pacheco a ultima informação é sob o modo de "transação".

A anotação @Pool serve para indicar o pool do JBoss que irá lidar com este EJB, desta forma posso definir o numero máximo de threads que o pool tera. Além disso tenho duas anotação para configurar a transação, que por natureza neste caso é XA, como não tenho necessidade de transações distribuidas e de transações eu estou desligando isso através das configurações BEAN para informar ao JBoss que o Bean gerencia a configuração e NOT_SUPPORTED para não utilizarmos as transações.

O que é mais importante neste caso é a anotação @ResourceAdapter que indica a seguinte configuração: activemq-ra.rar. Este nome é  o diretório que criamos no profile padrão do jboss com o Resource Adapter, certifique-se de que é o mesmo nome por que do contrário não vai funcionar.

Agora você pode fazer o deploy do jar com o ejb-mdb no container, uma vez isso feito você pode subir o ActiveMQ e entrar no console web e enviar uma mensagem para testar, confira as figuras a baixo para ver como mandar a mensagem pelo console web.

Enviando uma mensagem pelo console web

Entre no console e clique em queue e clique no botão send to ao lado da fila correta conforme a imagem a baixo.


Escreva qualquer texto e mande enviar conforme a página a baixo, após isso podemos verificar no console do jboss que a mensagem foi recebida com sucesso.



E eras isso, pronto. Estamos recebendo e enviando messagems para o broker activemq através do JBoss, se você quizer pode baixar o meu projeto do ejb com o código que esta no meu repositório do subversion.

Abraços e até a próxima.

Popular posts from this blog

Kafka Streams with Java 15

Rust and Java Interoperability

HMAC in Java