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.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();
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