Back-End

18 jun, 2010

Resource Adapter do ActiveMQ para JBoss

Publicidade

Veremos 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, veremos 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 baixado todos eles, podemos prosseguir. Extraia o
ActiveMQ em algum diretório de sua máquina e crie uma variável de
ambiente apontando para o local da instalação. Essa variável deve se
chamar $ACTIVEMQ_HOME. Você deve fazer o mesmo procedimento para o
JBoss AS, mas a variável de ambiente deve se chamar $JBOSS_HOME.
Estou assumindo que você já instalou o JDK 6 do java e criou a variável
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. Esse é o resource adapter de que
estou falando. Agora vamos instalar o arquivo em algum profile do JBoss; você pode criar o seu próprio profile ou colocar dentro de algum
existente. Eu vou usar o profile *default*.

Se posicione em $JBOSS_HOME/server/default/deploy e crie o
seguinte diretório activemq-ra.rar; nesse diretório, você deve
extrair todo o conteúdo do arquivo activemq-rar-5.3.2.rar. Uma vez que
você tenha feito esse processo, o Resource Adapter já vai estar
instalado. 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 essa 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 está no xml abaixo.

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

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

Dessa forma, a configuração está 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 mensagens usando o Resource
Adapter. Primeiro vamos ao código, depois eu explico os elementos-chave, confiram abaixo:

</p><p>package com.blogspot.diegopacheco.messageria;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.jboss.ejb3.annotation.Pool;
import org.jboss.ejb3.annotation.ResourceAdapter;
import org.jboss.ejb3.annotation.defaults.PoolDefaults;

/**
*
* @author Diego Pacheco
*
*/
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "fila_pacheco"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })
@ResourceAdapter("activemq-ra.rar")
@Pool(value=PoolDefaults.POOL_IMPLEMENTATION_STRICTMAX,maxSize=10)
@TransactionManagement(TransactionManagementType.BEAN)
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class Carteiro implements MessageListener {

public void onMessage(Message msg) {
System.out.println("Mensagem chegou aqui! ");
try{
if (msg instanceof TextMessage){
System.out.println("TextMessage: " + ((TextMessage)msg).getText());
}
}catch(Exception e){
e.printStackTrace();
}
}
} </p><p>

Essa classe em cima é um EJB, mas é um especial, do tipo Message Driven
Bean, ou simplesmente MDB. Um MDB é uma forma de um EJB receber mensagens
de forma assíncrona de dentro do container EJB. Isso é bom, porque
dessa forma podemos deixar o JBoss gerenciar as threads e controlar
melhor o consumo de mensagens.

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


Vamos às anotações do código acima.

Existe a anotação @MessageDriven
com três subanotações chamadas @ActivationConfigProperty, que configuram o
consumo de mensagens; essas 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
esse EJB. D. Dessa forma, posso definir o número máximo de threads que o
pool terá. Além disso, tenho duas anotações para configurar a transação,
que por natureza, neste caso, é XA. Como não tenho necessidade de
transações distribuídas 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 nesse caso é a anotação @ResourceAdapter, que
indica a seguinte configuração: activemq-ra.rar. Esse nome é o
diretório que criamos no profile padrão do jboss com o Resource Adapter,
certifique-se de que é o mesmo nome, do contrário, não vai
funcionar.

Agora você pode fazer o deploy do jar com o ejb-mdb no container. Uma vez feito, você pode subir o ActiveMQ e entrar no console web e
enviar uma mensagem para testar. Confira as figuras abaixo 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 abaixo.


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

E era isso, pronto. Estamos recebendo e enviando messagens para o
broker activemq através do JBoss. Se você quiser, pode baixar o meu
projeto do ejb com o código
que está no meu repositório do subversion
.

Abraços e até a próxima.