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 -

No comments: