En ésta publicación explico el procedimiento para poder conectarnos a un broker de mensajería
ActiveMQ desde el contenedor de servlets
Tomcat.
Para ésta configuración usaré las siguientes versiones de
ActiveMQ y
Tomcat:
Librerías necesarias
Suponiendo que
TOMCAT_HOME=c:/Tomcat5.5 y ACTIVEMQ_HOME:c:/apache-activemq-5.5.0
Primero, se tiene que copiar las siguientes librerías al directorio
TOMCAT_HOME/common/lib
- activemq-all-5.5.0.jar (ACTIVEMQ_HOME)
- slf4j-log4j12-1.5.11.jar (ACTIVEMQ_HOME/lib/optional)
- log4j-1.2.14.jar (ACTIVEMQ_HOME/lib/optional)
NOTA: asegurarse que no se encuentren otras librerías de activemq de versiones anteriores en las aplicaciones web que estén desplegadas en
Tomcat.
Configuración del archivo server.xml
En el archivo
server.xml que se encuentra en
TOMCAT_HOME/conf incluir lo siguiente dentro del elemento
GlobalNamingResources:
<GlobalNamingResources>
<Resource name="jms/ConnectionFactory"
auth="Container"
type="org.apache.activemq.ActiveMQConnectionFactory"
description="JMS Connection Factory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
brokerURL="tcp://127.0.0.1:61616"
brokerName="activeMQBroker"/>
<Resource auth="Container"
name="jms/MiCola"
type="org.apache.activemq.command.ActiveMQQueue"
description="Cola de mensajes"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="com.blogspot.ingmmurillo.queue"/>
</GlobalNamingResources>
Nótese que en
brokerURL se especifica el servidor en dónde está corriendo
Apache ActiveMQ, en este caso se encuentra en la misma máquina. Además, es necesario especificar todas las colas y tópicos a los cuáles se va a conectar, en este caso voy a conectarme a la cola
com.blogspot.ingmmurillo.queue
Configuración del archivo context.xml
En el archivo
context.xml que se encuentra en
TOMCAT_HOME/conf incluir lo siguiente:
<Context>
<ResourceLink global="jms/ConnectionFactory" name="jms/ConnectionFactory" type="javax.jms.ConnectionFactory"/>
<ResourceLink global="jms/MiCola" name="jms/MiCola" type="javax.jms.Queue"/>
</Context>
Configuración del archivo web.xml
En el descriptor de despliegue
web.xml que se encuentra en
TOMCAT_HOME/conf incluir lo siguiente:
<resource-ref>
<description>JMS Connection</description>
<res-ref-name>jms/ConnectionFactory</res-ref-name>
<res-type>javax.jms.ConnectionFactory</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<resource-ref>
<res-ref-name>jms/MiCola</res-ref-name>
<res-type>javax.jms.Queue</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
Cabe mencionar que con ésta configuración, la conexión a
ActiveMQ será visible para cualquier aplicación web desplegada sobre
Tomcat.
Código Java para conexión a ActiveMQ y envió de un mensaje
A continuación explico cómo sería el código
Java para conectarnos al bróker de mensajería y envíar un mensaje de texto.
//...
Context initContext = new InitialContext();
Context jndiContext = (Context) initContext.lookup("java:comp/env");
ActiveMQConnectionFactory qFactory = (ActiveMQConnectionFactory)jndiContext.lookup("jms/ConnectionFactory");
QueueConnection qConnect = qFactory.createQueueConnection();
qConnect.start();
QueueSession qSession = qConnect.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue requestQ = (Queue) jndiContext.lookup("jms/MiCola");
QueueSender qSender = qSession.createSender(requestQ);
ObjectMessage msg = qSession.createObjectMessage(new String("Hola, ActiveMQ"));
qSender.send(msg);
qConnect.stop();