Buscar en el Blog

miércoles, 15 de junio de 2011

Cómo integrar Apache ActiveMQ y Apache Tomcat

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

2 comentarios:

  1. 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?

    ResponderEliminar
  2. En 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