08 May 2016

WSO2 ESB Scatter-Gather EIP

Este patrón nos permite enviar mensajes en paralelo a múltiples destinatarios y recopilar sus respuestas para devolverla como una sola.


Es decir con una sola petición de entrada podremos enviar varias peticiones (a diferentes endpoints y con differente formato de petición), recopilar todas las respuestas, procesarlas(aplicar transformaciones) y devolver un solo mensaje.

En el siguiente ejemplo crearé un servicio proxy que invocara en paralelo las operaciones "echoInt" y "echoString" del servicio "echo" que viene con el ESB, recogerá las respuestas y devolverá un un mensaje con el resultado de las mismas.



El servicio proxy:
<proxy name="scatter-gather-proxy" ...>
  <target 
    inSequence="scatter-gather-sequence-in" 
    outSequence="scatter-gather-sequence-out"/>
</proxy>


La secuencia de entrada (inSequence) usando "Clone mediator":
<sequence name="scatter-gather-sequence-in" ...>
  <log level="custom">
    <property name="MSG" value="SEQUENCIA ENTRADA"/>
  </log>
  <clone id="echoClone">
    <target sequence="scatter-gather-echoInt-sequence-in"/>
    <target sequence="scatter-gather-echoString-sequence-in"/>
  </clone>
</sequence>


La secuencia de entrada para invocar echoInt:
<sequence name="scatter-gather-echoInt-sequence-in" ...>
  <log level="custom">
    <property name="secuencia" 
                 value="scatter-gather-echoInt-sequence-in entrada"/>
  </log>
  <property description="SOAPAction" name="SOAPAction" scope="transport"
    type="STRING" value="urn:echoInt"/>
  <payloadFactory description="echoInt" media-type="xml">
    <format>
      <echo:echoInt xmlns:echo="http://echo.services.core.carbon.wso2.org">
        <in xmlns="">$1</in>
      </echo:echoInt>
    </format>
    <args>
      <arg evaluator="xml" expression="//echoData/number"/>
    </args>
  </payloadFactory>
  <log level="custom">
    <property name="secuencia" 
                 value="scatter-gather-echoInt-sequence-in salida"/>
  </log>
  <send>
    <endpoint key="echo-endpoint"/>
  </send>
</sequence>


La secuencia de entrada para invocar echoString:
<sequence name="scatter-gather-echoString-sequence-in" ...>
  <log level="custom">
    <property name="secuencia" 
                 value="scatter-gather-echoString-sequence-in entrada"/>
  </log>
  <property description="SOAPAction" name="SOAPAction" scope="transport"
    type="STRING" value="urn:echoString"/>
  <payloadFactory description="echoString" media-type="xml">
    <format>
      <echo:echoString xmlns:echo="http://echo.services.core.carbon.wso2.org">
        <in xmlns="">$1</in>
      </echo:echoString>
    </format>
    <args>
      <arg evaluator="xml" expression="//echoData/text"/>
    </args>
  </payloadFactory>
  <log level="custom">
    <property name="secuencia" 
                 value="scatter-gather-echoString-sequence-in salida"/>
  </log>
  <send>
    <endpoint key="echo-endpoint"/>
  </send>
</sequence>


La secuencia de entrada (outSequence) usando "Aggregate mediator":
<sequence name="scatter-gather-sequence-out" ...>
  <log level="custom">
    <property name="msg" value="SEQUENCIA SALIDA"/>
  </log>
  <aggregate id="echoClone">
    <completeCondition>
      <messageCount max="2" min="2"/>
    </completeCondition>
    <onComplete expression="//soapenv:Body/*[1]" 
                 xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
      <log level="full">
        <property name="ON-COMPLETE" value="EJECUTANDO AGREGATOR"/>
      </log>
      <payloadFactory description="make response" media-type="xml">
        <format>
          <aggregateResult xmlns="">
            <returnInt>$1</returnInt>
            <returnString>$2</returnString>
          </aggregateResult>
        </format>
        <args>
          <arg evaluator="xml" 
                  expression="//ns:echoIntResponse/return" 
                  xmlns:ns="http://echo.services.core.carbon.wso2.org"/>
          <arg evaluator="xml" 
                  expression="//ns:echoStringResponse/return" 
                  xmlns:ns="http://echo.services.core.carbon.wso2.org"/>
        </args>
      </payloadFactory>
      <send/>
    </onComplete>
  </aggregate>
</sequence>


Enlaces relacionados:
- FIN -

20 April 2016

WSO2 ESB Changing Hostname and WSDL prefix

Probablemente durante el desarrollo de servicios con WSO2 ESB, nos hemos topado con un par de cosillas que siempre tenemos que tener en cuenta:
  • Cuando DevStudio abre el navegador con la consola, siempre aparece la IP de la máquina con la que estamos trabajando (dicha IP varia según la red a la que estemos conectados)
  • Usualmente en los endpoints publicados de los proxies aparece el nombre de la máquina
Ambos casos se pueden ver en la siguiente imagen.

En el primero de los casos, resulta un poco incordiante estar aceptando siempre el certificado digital generado para esa IP. En el segundo de los casos, debemos tener cuidado de cuando utilizamos el endpoint (por ejemplo para hacer testing) cambiar el nombre de la máquina por "localhost" u otro nombre que figure en el fichero hosts.

Para cambiar ambos valores debemos cambiar los ficheros ..\repository\conf\carbon.xml y ..\repository\conf\axis2\axis2.xml respectivamente.

..\repository\conf\carbon.xml
..\repository\conf\axis2\axis2.xml

Después de reiniciar el servidor podemos ver reflejados los cambios.
- FIN -