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:
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.
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:
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.
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
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><!-- <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.