wso2 ESB: Wzorzec Split / Gather - Single Response

To jestnie pytanie ale raczejodpowiedź. Jestem całkiem nowy w wso2 ESB i chciałem wykonać testowy test implementujący split / gather EIP jako część POC. Poszedłem za przykładami, które znalazłem i natychmiast dostałem działającą konfigurację, która zwróciła pojedynczą odpowiedź. Jednak, aby uzyskać wszystkie odpowiedzi, potrzeba było trochę czasu, aby się zorientować. Większość podanych próbek wydawała się tworzyć ten sam nieoczekiwany wynik. Mam nadzieję, że jeśli napotkasz ten sam problem, te linie będą ci przydatne.

Ustawiać

Użyłemprzykładowa usługa soapUI (operacja wyszukiwania) jako backend usługi. Wysłałem wiadomość złożoną, szukającdwie rzeczy do serwera proxy (patrz artefakt poniżej)iteruj podział mediatora wiadomość i przekazuje ją do punktu końcowego, który wywołuje makietę soapUI. Thełączny mediator czeka na wszystkie odpowiedzi i próbuje umieścić je w jednym komunikacie wynikowym.

Problem

Chociaż rozdzielacz działał poprawnie, agregator powróciłtylko jeden element wyniku nie ma listy elementów zgodnie z oczekiwaniami. Wszystkie dzienniki wykazały, że wszystko było w porządku, kilka żądań zostało wysłanych do odpowiednich punktów końcowych, ale nadal tylko pierwsza odpowiedź, która zwróciła, była widoczna w ostatecznej odpowiedzi.

Rozwiązanie

Po ustawieniu poziomu logowania serwera proxy na TRACE zdałem sobie sprawę, że agregator działa dobrze, tylko że utworzył wiadomość, która nie była zgodna z SOAP. Wszystkoelementy zagregowane zostały dodanebezpośrednio pod ciałem mydła. Pytanie brzmiało, jak dodać jeden element główny między znacznikami ciała i znacznikami wyników. Najpierw wypróbowałem XSLT, ale mogłem również odczytać tylko pierwszy element potomny ciała. Wreszcie znalazłem jakąś głęboko zakopaną aluzjęposługiwać się wzbogacić mediatora (a raczej seria tego) i to załatwiło sprawę. Poniższa lista wyjaśnia część konfiguracji (kod pokazany poniżej), której nie można znaleźć w większości przykładów.

Użyj najpierw opcji Enrich, aby przechwycić wszystkie istotne elementy w nieruchomościZapomnij o bieżącej wiadomości - przepisz całą kopertę z treścią zawierającą tylko nowy element główny ładunkuDołącz elementy zapisane we właściwości do nowego katalogu głównego ładunku.W razie potrzeby przechwyć nagłówek mydła do właściwości i dołącz go do nowego msg (nie w poniższej konfiguracji)ArtefaktyZapytanie demo
<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>
Konfig
<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>
Wreszcie pytanie

Jeśli ktoś mógłby mi zasugerować jakąś dokumentację lub dać mi konfigurację roboczą dla atrybutu correlateOn zagregowanego mediatora, byłbym wdzięczny.

questionAnswers(2)

yourAnswerToTheQuestion