Ir al contenido principal

Cómo usar ActiveMQ 5 con WSO2 Enterprise Integrator

ActiveMQ and WSO2

Este artículo describe el uso de ActiveMQ 5 como bróker de mensajería con WSO2 Enterprise Integrator 6.6.0. 

Comencemos hablando acerca de qué es un bróker de mensajería. De acuerdo con Wikipedia, un bróker de mensajería (message broker, en inglés) es un programa intermediario que traduce los mensajes desde un remitente a un receptor; ambos de protocolo de mensajería formal.  

Básicamente, un bróker de mensajería es un programa que ayuda a traducir, dirigir, persistir y entregar mensajes que una aplicación fuente (productor) envía a un destino (consumidor).   Es más como un middleware de mensajería. Esto resulta muy útil cuando se trata de aplicaciones de comunicación de grandes infraestructuras en crecimiento. Existen diferentes tipos de bróker de mensajería, tales como RabbitMQ, IBM MQ, JBoss Messaging, ActiveMQ, etc.

¿Qué es ActiveMQ?

ActiveMQ es un bróker de mensajería de código abierto de Apache escrito en Java junto con un cliente de servicio de mensajes Java completo (JMS, por sus siglas en inglés). Proporciona diferentes tipos de servicios de alta disponibilidad, de intercambio de archivos, de intercambio de bases de datos, etc. A través de ActiveMQ Classic, se puede obtener más información sobre ActiveMQ.

Configurar ActiveMQ 5 con WSO2 Enterprise Integrator 6.6.0

Comencemos con la configuración de ActiveMQ 5 con WSO2 Enterprise Integrator 6.6.0. Antes de pasar a las configuraciones, es necesario descargarse el software correspondiente.

Una vez se han descargado los paquetes, se extraen y se colocan en una carpeta para que sea más sencillo hacer modificaciones en las configuraciones. Nombre la carpeta AMQ como <AMQ_HOME> y la carpeta Enterprise Integrator como <EI_HOME>.

1.Copie los siguientes archivos JAR desde <AMQ_HOME>/libs a <EI_HOME>/libs

  • activemq-broker-5.8.0.jar
  • activemq-client-5.8.0.jar
  • activemq-kahadb-store-5.8.0.jar 
  • geronimo-jms_1.1_spec-1.1.1.jar
  • geronimo-j2ee-management_1.1_spec-1.0.1.jar
  • geronimo-jta_1.0.1B_spec-1.0.1.jar
  • hawtbuf-1.9.jar
  • slf4j-api-1.6.6.jar
  • activeio-core-3.1.4.jar (disponible en <ACTIVEMQ_HOME>/lib/optional directory) 

2.Ahora, es necesario activar el escucha de trasporte JMS (listener, en inglés). Para activarlo, abra el archivo axis.xml en el directorio <EI_HOME>/conf/axis2 y descomente la siguiente configuración.

<!--Uncomment this and configure as appropriate for JMS transport support, after setting up your JMS environment (e.g. ActiveMQ)-->
<transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">
      <parameter name="myTopicConnectionFactory" locked="false">
          <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
          <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>
          <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">TopicConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>
      </parameter>
 
      <parameter name="myQueueConnectionFactory" locked="false">
          <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
          <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>
          <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
      </parameter>
 
      <parameter name="default" locked="false">
          <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
          <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>
          <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
      </parameter>
  </transportReceiver>

3.A continuación, active el remitente de transporte JMS. Para hacerlo, descomente la siguiente configuración en el mismo archivo previamente mencionado.

<transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender"/>

Ahora, todas las configuraciones están completas.

4.Abra un nuevo terminal y rediríjalo a <AMQ_HOME>/bin y ejecute ./activemq start.

Para el registro de AMQ, se puede verificar desde el archivo <AMQ_HOME>/data/activemq.log. Abra un terminal y ejecute el comando; tail -f <AMQ_HOME>/data/activemq.log.

5.Finalmente, abra un terminal e inicie el servidor de Enterprise Integrator. sh <EI_HOME>/bin/integrator.sh

Se puede iniciar sesión en la consola AMQ http://localhost:8161/ usando admin tanto para el nombre de usuario como la contraseña. 

Confirmar la conectividad entre ActiveMQ 5 y WSO2 Enterprise Integrator 6.6.0

Haré una demostración de un simple caso de uso, donde;

  • el cliente envía solicitudes a un servicio de proxy;
  • el servicio de proxy almacena los mensajes en un almacén de mensajes JMS;
  • el servicio back-end es invocado por un procesador de reenvío de mensajes, que elige los mensajes almacenados en el almacén de mensajes del JMS. 

Configurar el Broker Service

Cree un almacén de mensajes JMS de prueba en el WSO2 Enterprise Integrator. Inicie sesión en la consola de administración del WSO2 Enterprise Integrator, en la pestaña Main, service bus → Message store → Add Message Stores → Add JMS Message Store. Proporcione las siguientes configuraciones y haga clic en «Save». Los almacenes de mensajes JMS se emplean también para  implementar un patrón de almacenamiento y reenvío que posee parámetros de calidad de servicio (QoS, en inglés); como la entrega de pedidos y la fiabilidad.

  1. Nombre: JMSMS
  2. Fábrica de contexto inicial: org.apache.activemq.jndi.ActiveMQInitialContextFactory
  3. URL: tcp://localhost:61616

Configurar el servicio back-end

  1. Despliegue el cliente SimpleStockQuoteService. Para llevar a cabo esta acción, abra un nuevo terminal y diríjase a <EI_HOME>/samples/axis2Server/src/SimpleStockQuoteService.  Después, ejecute el comando ant. Esto creará la muestra y se desplegará el servicio.  
  2. Por defecto, WSO2 Enterprise Integrator viene con un servidor Axis2, el cual se puede usar como servicio back-end para esta muestra.  Para iniciar el servidor Axis2, diríjase a <EI_HOME>/samples/axis2server y ejecute axis2Server.sh (en Linux) o axis2Server.bat (en Windows).
  3. Para verificar que el servicio funciona, escriba en su navegador: http://localhost:9000/services/SimpleStockQuoteService?wsdl

Configurar el ESB

1.Crear un punto final de HTTP. Para hacer esto, en la pestaña Main, service bus → Endpoints → Add Endpoints → HTTP Endpoint. Proporcione las configuraciones anteriores y haga clic en «save & close».

2.Crear un servicio de proxy que guarde mensajes en el almacén de mensajes creado.  Ahora, cree un proxy para guardar mensajes. Para hacer eso, en la pestaña Main, Add → Proxy service → Custom proxy. Cambie la vista fuente y añada las configuraciones siguientes.

<proxy name="Proxy1" xmlns="http://ws.apache.org/ns/synapse" transports="https http" startOnLoad="true" trace="disable"> 
  <target>
    <inSequence>
        <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
        <property name="OUT_ONLY" value="true"/>
        <property name="target.endpoint" value="SimpleStockQuoteService"/>
        <log level="full"/>
        <store messageStore="JMSMS"/>
    </inSequence>
  </target>
</proxy>

3.Cree un procesador de reenvío de mensajes utilizando la siguiente configuración. Un procesador de reenvío de mensajes consume los mensaje que se guardan en el almacén de mensajes.

  • Nombre: Processor1
  • Nombre del punto final: SimpleStockQuoteService
  • Almacén de mensajes: JMSMS

Ejecutar la muestra

Para invocar el servicio de proxy, usaremos el cliente Axis2 de prueba que se envía con el Enterprise Integrator. Diríjase al directorio <EI_HOME>/samples/axis2client y ejecute el siguiente comando para invocar el servicio de proxy

ant stockquote -Daddurl=http://localhost:8280/services/Proxy1 -Dmode=placeorder

Verá un mensaje de registro en el servidor de Enterprise Integrator parecido al siguiente registro.

NFO {org.apache.synapse.mediators.builtin.LogMediator} - To: http://localhost:8280/services/Proxy1, WSAction: urn:placeOrder, SOAPAction: urn:placeOrder, ReplyTo: http://www.w3.org/2005/08/addressing/none, MessageID: urn:uuid:89efc045-08a2-4689-a5ab-bffba6423bcc, Direction: request, Envelope: 

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:To>http://localhost:8280/services/Proxy1</wsa:To>
<wsa:ReplyTo>
<wsa:Address>http://www.w3.org/2005/08/addressing/none</wsa:Address>
</wsa:ReplyTo>
<wsa:MessageID>urn:uuid:89efc045-08a2-4689-a5ab-bffba6423bcc</wsa:MessageID>
<wsa:Action>urn:placeOrder</wsa:Action>
</soapenv:Header>
<soapenv:Body>
<m0:placeOrder xmlns:m0="http://services.samples">
<m0:order>
<m0:price>149.31226495996034</m0:price>
<m0:quantity>18816</m0:quantity>
<m0:symbol>IBM</m0:symbol>
</m0:order>
</m0:placeOrder>
</soapenv:Body>
</soapenv:Envelope>

Verá un mensaje de registro en el servidor del Axis2 parecido al siguiente registro.

samples.services.SimpleStockQuoteService  :: Accepted order #1 for : 18816 tocks of IBM at $ 149.31226495996034

Si se inicia sesión en el servidor de AMQ, verá la cola JMSMS en de la pestaña queue

Así es como se usa ActiveMQ 5 como un bróker de mensajería con WSO2 Enterprise Integrator 6.6.0.  En líneas generales, configuramos ActiveMQ con WSO2 Enterprise Integrator. Después, para verificar la conectividad entre los servidores, creamos un almacén de mensajes JMS y desplegamos el servicio back-end.  A continuación, definimos un punto final, para enviar mensajes al servicio back-end, y un proxy para guardar mensajes en el almacén de mensajes que se creó. El último paso fue crear un procesador de reenvío de mensajes para consumir los mensajes almacenados. Finalmente, invocar el servicio de proxy.