martes, 1 de septiembre de 2015

WSO2 ESB: publicando y leyendo mensajes en IBM MQ.

En la entrada anterior vimos como configurar el IBM MQ y los ajustes a realizar en el WSO2 ESB para integrarse con el IBM MQ.

En esta entrada veremos la configuración de 2 proxies. Uno para escribir un mensaje en la cola y otro para leer el mensaje de la cola.

Servicio proxy para enviar un mensaje XML a una cola en IBM MQ:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="testMQsender" 
                      transports="http"
                      startOnLoad="true"
                      trace="disable">
  <description/>
  <target>
  <endpoint>
  <address uri="jms:/myQueueRecieve?transport.jms.ConnectionFactoryJNDIName=myQueueConnectionFactory&java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&java.naming.provider.url=file:/C:/JNDI-Directory&transport.jms.DestinationType=queue&transport.jms.ConnectionFactoryType=queue&transport.jms.Destination=myQueueRecieve"/>
  </endpoint>
  <inSequence>
  <log level="custom">
     <property name="ESTADO" value="Mensaje enviado a la cola myQueueRecieve"/>
  </log>
  <property name="OUT_ONLY" value="true"/>
  <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
  <property name="Accept-Encoding" scope="transport" action="remove"/>
  <property name="Content-Length" scope="transport" action="remove"/>
  <property name="User-Agent" scope="transport" action="remove"/>
  <property name="Content-Type" scope="transport" action="remove"/>
  <property name="Transfer-Encoding" scope="transport" action="remove"/>
  </inSequence>
  <outSequence/>
    <sequence name="fault">
        <log level="full">
            <property name="MESSAGE" value="Executing default fault sequence"/>
            <property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/>
            <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/>
        </log>
        <drop/>
    </sequence>      
   </target>
   <parameter name="transport.jms.ConnectionFactory">myQueueConnectionFactory</parameter>
   </proxy>

NOTAS:
  1. Se agrega la propiedad OUT_ONLY como true para indicar que es una operación de un solo sentido.
  2. En el caso de los mensajes de un solo sentido y que son JMS no se devuelve por defecto el código 202, hay que indicarle al ESB que lo retorne al cliente usando la propiedad FORCE_SC_ACCEPTED.
  3. Las propiedades en el scope de transporte se eliminan siempre que incluyan el caracter – en su nombre, pues el IBM MQ cumple con la especificación que indica que no se puede usar dicho caracter en el nombre de las propiedades.

Antes de poner el mensaje en cola, podemos ver que en el Explorer MQ el estado de las colas es el siguiente:


image

Luego de poner el mensaje en la cola invocando al servicio y enviandole un payload XML:

image

En la cola se ve que la profundidad ahora es 1.

image

Si exploramos en la cola, veremos el mensaje.

image

Y en el ESB veremos el log:

image


Para consumir un mensaje de la cola el servicio proxy es el siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="testMQrecieve" 
    transports="jms" 
    startOnLoad="true">
    <description/>    
 <target>
  <inSequence>
  <log level="custom">
     <property name="ESTADO" value="Leyendo mensaje de la cola myQueueRecieve"/>
  </log>  
   <property name="OUT_ONLY" value="true"/>
   <log level="full"/>
   <drop/>
  </inSequence>
  <outSequence/>
    <sequence name="fault">
        <log level="full">
            <property name="MESSAGE" value="Executing default fault sequence"/>
            <property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/>
            <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/>
        </log>
        <drop/>
    </sequence>  
 </target>
 <parameter name="transport.jms.ContentType">
  <rules>
   <jmsProperty>contentType</jmsProperty>
   <default>application/xml</default>
  </rules>
 </parameter>
 <parameter name="transport.jms.ConnectionFactory">myQueueConnectionFactory</parameter>
 <parameter name="transport.jms.DestinationType">queue</parameter>
 <parameter name="transport.jms.Destination">myQueueRecieve</parameter>
</proxy>


NOTAS:
  1. De esta configuración lo más interesante es el parámetro transport.jms.ContentType donde especificamos que será application/xml.
  2. Este proxy no es necesario iniciarlo con una llamada, pues automaticamente está escuchando en la cola myQueueRecieve y cuando detecta un mensaje invoca a la secuencia de entrada.

El log en el ESB es el siguiente:

image

En la siguiente entrada veremos como implementar estas funcionalidades en un solo proxy REQUEST/RESPONSE.

0 comentarios:

Publicar un comentario