Skip to content

Um simples exemplo usando JBoss Messaging com Mysql

Maio 26, 2011

Neste post pretendo passar um exemplo bem básico do uso de filas JMS no JBoss Messaging utilizando persistência em um banco de dados relacional, no meu caso mysql. As configurações que aqui serão demonstradas foram executadas em um ambiente com a versão 5.1 do JBoss AS, utilizando como base o perfill all, que já vem configurado com o módulo de mensageria.

Primeiramente vamos à definição de nossa fila, editando o arquivo …/deploy/messaging/destinations-service.xml. Adicione o trecho abaixo após as configurações das filas DLQ e Expiry, que já veem configuradas por padrão. Este mbean representa a descrição de nossa fila, que será referenciada no código fonte.

 <mbean code="org.jboss.jms.server.destination.QueueService"
          name="jboss.messaging.destination:service=Queue,name=ChiesQueue"
          xmbean-dd="xmdesc/Queue-xmbean.xml">
      <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
      <depends>jboss.messaging:service=PostOffice</depends>
      <attribute name="JNDIName">queue/ChiesQueue</attribute>
      <attribute name="RedeliveryDelay">10000</attribute>
      <attribute name="MaxDeliveryAttempts">3</attribute>
 </mbean>

Agora vamos à configuração do uso da persistência em um banco de dados mysql.
Como padrão, o serviço de mensagens vem configurado para utilização de hsql através da presença do arquivo hsqldb-persistence-service.xml, que também está contido no diretório …/deploy/messaging/. Para utilização do mysql basta remover este arquivo (ou renomeá-lo como hsqldb-persistence-service.xml.rej) e substituí-lo por um persistence service do mysql. Um exemplo desse arquivo pode ser encontrado em …/jboss/docs/examples/jms/mysql-persistence-service.xml. Podemos simplesmente copiar esse exemplo e substituir as referências para o datasource com o jndiname utilizado no DS de configuração do banco de dados a ser criado. No meu caso, criei um schema no mysql chamado jmsspike e em seguida o jmsspike-ds.xml como segue abaixo:

<datasources>
  <local-tx-datasource>
    <jndi-name>JMSSpikeDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/jmsspike</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-namevspikes</user-name>
    <password>spikes01</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
    <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name>
    <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>

Abaixo segue os pontos do arquivo mysql-persistence-service.xml que devem ser alterados. Atente ao fato de que o par de alterações abaixo são aplicados em três locais no arquivo.

De: jboss.jca:service=DataSourceBinding,name=DefaultDS
Para: jboss.jca:service=DataSourceBinding,name=JMSSpikeDS

De: java:/DefaultDS
Para: java:/JMSSpikeDS

Vale a pena destacar que este arquivo possui todos os statements nescessários para a inicialização da base de dados com as tabelas utilizadas pelo serviço. Caso sua base/usuário tenha privilégios de criar tabelas, basta conservar os atributos CreateTablesOnStartup como true que, quando o servidor for inicializado pela primeira vez, toda estrutura inicial será criada. Caso não exista esse privilégio, apenas copie os statements que existem neste arquivo e execute-os manualmente.

Um último passo para esta troca do hsql para mysql é a alteração do arquivo messaging-jboss-beans.xml, substituindo a referência ao datasource DefaultDS para o nosso JMSSpikeDS, como segue no trecho abaixo:

De: java:/DefaultDS
Para: java:/JMSSpikeDS

Pronto. Toda a configuração do servidor está pronta para abrigar nossa aplicação de exemplo.

A definição da fila no código fonte é dada pelo trecho de código abaixo:

@MessageDriven(
		name="ChiesQueue",
		activationConfig= {  
				@ActivationConfigProperty(propertyName="destination",propertyValue="queue/ChiesQueue"),  
				@ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue")  
		}	
)
public class SampleMDB implements MessageListener{

	@Override
	public void onMessage(Message message) {
		try {
			ObjectMessage objectMessage = (ObjectMessage) message;
			SampleMessage sampleMessage = (SampleMessage) objectMessage.getObject();
			System.out.println("Msg received on Queue: sequential = " + sampleMessage.getSequential() + " description = " + sampleMessage.getDescription());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Já o código que insere mensagens nesta fila pode ser verificado abaixo:


InitialContext ctx = new InitialContext();
Queue queue = (Queue) ctx.lookup("queue/ChiesQueue");
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
QueueConnection connection = factory.createQueueConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
ObjectMessage message = session.createObjectMessage(sampleMessage);
MessageProducer producer = session.createProducer(queue);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
producer.send(message);

No meu caso, para fins de teste, coloquei o código do producer em um recurso REST. Porém, não serão aqui detalhadas as implementações que não estão diretamente relacionadas à configuração JMS. Caso queiram se basear na minha implementação, segue abaixo o link para o github.

https://github.com/rafachies/jmsspike

Bom, espero ter sido claro nas explicações. Qualquer dúvida estou a disposição.

[]’s

From → Uncategorized

Deixe um Comentário

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

Coding Horror

Um prato de informações tecnológicas com uma pitada de conhecimento aleatório.

InfoQ

Um prato de informações tecnológicas com uma pitada de conhecimento aleatório.

JBoss Developer Recent Posts

Um prato de informações tecnológicas com uma pitada de conhecimento aleatório.

JBossDivers

Mergulhando no Mundo JBoss

%d bloggers like this: