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)
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.queueConfiguració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();
Mauri, y que pasa con la seguridad? es decir, si dices que cualquier aplicacion en Tomcat puede acceder a la implementacion de ActiveMQ, entonces desde una aplicacion podria manipular los datos de otra aplicacion accediendo a la misma cola?
ResponderEliminarEn este caso sí Mel, cualquier otra aplicación deployada en Tomcat podría conectarse al broker de mensajería y enviar o leer mensajes de una cola. Una alternativa para aislar esto es que el archivo context.xml sea deployado en la aplicación web, en el directorio META-INF/context.xml.
ResponderEliminar