martes, 8 de septiembre de 2015

WSO2 ESB + IBM MQ:Escenario REQUEST/RESPONSE.

En una entrada anterior veíamos como crear proxys en el WSO2 ESB para escribir y leer mensajes de colas creadas en IBM MQ, y habíamos quedado en que mostraríamos como implementar un escenario request/response:




Los pasos identificados en la imagen anterior son los siguientes:
  1. Al WSO2 ESB llega un mensaje a través de un API.
  2. La API envía el mensaje a una cola en el IBM MQ. La cola es SMSStore.
  3. El proxy que está escuchando en la cola del punto 2, recupera el mensaje en su secuencia de entrada.
  4. El mensaje es enviado al servicio backend, desplegado en el WSO2 AS.
  5. La respuesta generada por el backend es enviada al proxy.
  6. La respuesta del punto 5 es puesta en una cola de respuesta, indicada en la configuración del endpoint del punto 2.
  7. La API recupera el mensaje puesto en la cola de respuesta. La cola de respuesta es SMSReceiveNotificationStore.
  8. El mensaje es enviado de vuelta al cliente.

Veamos la API como queda:

<?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse"
     name="CustomersAPI"
     context="/Customers">
   <resource methods="POST GET" uri-template="/getCustomer*">
      <inSequence>   
   <property action="remove" name="TRANSPORT_HEADERS" scope="axis2"/>     
         <send>
            <endpoint>
               <address uri="jms:/SMSStore?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.ReplyDestination=SMSReceiveNotificationStore&transport.jms.ConnectionFactoryType=queue&transport.jms.ContentTypeProperty=contentType"/>
            </endpoint>
         </send>
      </inSequence>
      <outSequence>
     <property action="remove" name="TRANSPORT_HEADERS" scope="axis2"/> 
  <send/>
      </outSequence> 
   </resource> 
</api>

El proxy que es invocado indirectamente(escucha en la cola donde se pone el mensaje) por la API es el siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="CustomerProxy"
       transports="jms"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target faultSequence="fault">
      <inSequence>
        <log level="full"/>        
         <send>
            <endpoint>
               <address uri="http://localhost:9765/jaxrs_basic/services/customers/customerservice/customers">
                  <suspendOnFailure>
                     <errorCodes>-1</errorCodes>
                     <progressionFactor>1.0</progressionFactor>
                  </suspendOnFailure>
                  <markForSuspension>
                     <errorCodes>-1</errorCodes>
                  </markForSuspension>
               </address>
            </endpoint>
         </send>
      </inSequence>
      <outSequence>
        <log level="full"/>   
        <property name="Content-Length" scope="transport" action="remove"/>
        <property name="Content-Type" scope="transport" action="remove"/>
         <send/>
      </outSequence>
   </target>
   <parameter name="transport.jms.ContentType">
      <rules>
         <jmsProperty>contentType</jmsProperty>
         <default>text/xml</default>
      </rules>
   </parameter>
   <parameter name="transport.jms.ConnectionFactory">myQueueConnectionFactory</parameter>
   <parameter name="transport.jms.DestinationType">queue</parameter>
   <parameter name="transport.jms.Destination">SMSStore</parameter>
   <description/>
</proxy>

La invocación al API se realiza usando el plugin de firefox RESTClient:



De esta manera queda definido cómo se puede establecer una comunicación entre distintos componentes de la suite de wso2, en un escenario request/response, con colas involucradas las cuales han sido creadas en el IBM MQ.

Esperamos les sea de utilidad.

2 comentarios:

  1. Muy buen POST pero no me quedan claro dos cosas:
    1. Como el proxy envia el mensaje del backend hacia la cola SMSReceiveNotificationStore, sera que falto algo o hay algo que se realiza automatico y no me doy cuenta.
    2. En caso de que fueran varios clientes los que consuman ese api, a cada uno de ellos les llega el mensaje de response por separado o sea el mensaje de respuesta que era para el o todos los mensajes que estan en la cola

    ResponderEliminar
  2. Para el punto 1, prueba y me dices :-D
    Para el punto 2 tendrías que jugar con el tema de los ID de correlación, en caso que el broker no lo maneje automaticamente.

    ResponderEliminar