wso2 ESB: Padrão de divisão / coleta - Resposta única

Isto énão é uma pergunta mas sim umresponda. Eu sou muito novo no wso2 ESB e queria fazer um teste de implementação do split / gather EIP como parte de um POC. Eu segui os exemplos que encontrei e imediatamente obtive uma configuração de trabalho que retornou uma única resposta. No entanto, para obter todas as respostas de volta levou algum tempo para descobrir. A maioria das amostras dadas parecia criar o mesmo resultado inesperado. Espero que, se você se deparar com o mesmo tipo de problema, essas linhas serão úteis para você.

Configuração

Eu usei oserviço de amostra soapUI (operação de pesquisa) como backend de serviço. Enviei uma mensagem combinada procurandodois itens para o servidor proxy (veja o artefato abaixo)iterar divisões mediadoras a mensagem e encaminha para o endpoint que está chamando o mockup soapUI. omediador agregado aguarda todas as respostas e tenta colocá-las em uma mensagem de resultado.

Problema

Embora o divisor estivesse funcionando corretamente, o agregador retornavaapenas um elemento de resultado não uma lista de elementos como esperado. Todos os registros mostraram que tudo estava bem, várias solicitações foram enviadas para os terminais correspondentes, mas ainda assim apenas a primeira resposta retornada ficou visível na resposta final.

Solução

Depois de definir o nível de log do proxy para TRACE, percebi que o agregador funcionava muito bem, apenas ele criava uma mensagem que não era realmente compatível com SOAP. Todoselementos agregados foi adicionadodiretamente abaixo do corpo de sabão. Então a questão era como adicionar um elemento raiz entre as tags body e result. Eu tentei XSLT primeiro, mas também só podia ler o primeiro elemento filho do corpo. Finalmente eu encontrei alguma sugestão profundamente enterrada parausar aenriquecer mediador (ou melhor, uma série disso) e que fez o truque. A lista a seguir explica a parte da configuração (código mostrado abaixo) que não é encontrada na maioria dos exemplos.

Use primeiro Enriqueça para capturar todos os itens relevantes em uma propriedadeEsqueça a mensagem atual - reescreva o envelope completo com o corpo contendo apenas o novo elemento raiz de carga útilAnexe os elementos armazenados na propriedade à nova raiz de carga útil.Se necessário, capture o cabeçalho soap em uma propriedade e anexe-o na nova msg (não na configuração abaixo)ArtefatosSolicitação de demonstração
<body>
   <sam:multisearch xmlns:sam="http://www.example.org/sample/">
      <sam:search>
         <sessionid>123</sessionid>
         <searchstring>Item 1</searchstring>
      </sam:search>
      <sam:search>
         <sessionid>123</sessionid>
         <searchstring>Item 2</searchstring>
      </sam:search>
   </sam:multisearch>
</body>
Config
<proxy xmlns="http://ws.apache.org/ns/synapse" name="test.multisearch" transports="https,http" statistics="enable" trace="enable" startOnLoad="true">
   <target>
      <inSequence>
         <iterate xmlns:sam="http://www.example.org/sample/" expression="//sam:multisearch/sam:search">
            <target>
               <sequence>
                  <send>
                     <endpoint key="soapUI_Mockup"/>
                  </send>
               </sequence>
            </target>
         </iterate>
      </inSequence>
      <outSequence>
         <aggregate>
            <completeCondition>
               <messageCount min="-1" max="-1"/>
            </completeCondition>
            <onComplete xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sam="http://www.example.org/sample/" expression="//sam:searchResponse">
               <enrich>
                  <source clone="true" xpath="$body//item"/>
                  <target type="property" property="ResultItems"/>
               </enrich>
               <log level="custom">
                  <property name="ResultItems" expression="get-property('ResultItems')"/>
               </log>
               <enrich>
                  <source type="inline" clone="true">
                     <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">                        
                        <soapenv:Header/>                        
                        <soapenv:Body>                           
                           <sam:GenericDataResponse/>                        
                        </soapenv:Body>                     
                     </soapenv:Envelope>
                  </source>
                  <target type="envelope"/>
               </enrich>
               <enrich>
                  <source type="property" clone="true" property="ResultItems"/>
                  <target action="child" xpath="//sam:GenericDataResponse"/>
               </enrich>
               <send/>
            </onComplete>
         </aggregate>
      </outSequence>
   </target>
   <description></description>
</proxy>
Finalmente uma pergunta

Se alguém puder me indicar alguma documentação ou me fornecer alguma configuração de trabalho para o atributo correlateOn do mediador agregado, eu realmente aprecio isso.

questionAnswers(2)

yourAnswerToTheQuestion