Synapse/WSO2: изменение сообщения в прокси-службе с помощью итерационного посредника

Вот проблема, которую я пытаюсь решить:

  1. получить сообщение
  2. обогатить сообщение, вызвав другую службу для получения информации (другой службой оказывается служба данных WSO2, но использование фиктивного прокси-сервера работает аналогично); см. здесь для получения информации о шаблоне обогащения
  3. отправить сообщение в пути

Входное сообщение выглядит так:

<PurchaseOrder xmlns="http://example.com/samples">
  <Header>
    <VendorData>
      <VendorNumber>123456</VendorNumber>
    </VendorData>
  </Header>
  <Body>
    <LineItem>
      <ItemNumber>111222333</ItemNumber>
    </LineItem>
    <LineItem>
      <ItemNumber>333224444</ItemNumber>
    </LineItem>
    <LineItem>
      <ItemNumber>123456789</ItemNumber>
    </LineItem>
  </Body>
</PurchaseOrder>

... и выходное сообщение должно выглядеть так:

<PurchaseOrder xmlns="http://example.com/samples">
  <Header>
    <VendorData>
      <VendorNumber>123456</VendorNumber>
    </VendorData>
    <VendorTerms>
      <Discount>
        <Description>15% NET 10</Description>
        <DiscountDays>10</DiscountDays>
      </Discount>
      <Days>30</Days>
      <TermsID>001</TermsID>
    </VendorTerms>
  </Header>
  <Body>
    <LineItem>
      <ItemNumber>111222333</ItemNumber>
      <SKU>ABC123PDQ789</SKU>
      <Cost>9.99</Cost>
      <Description>Widget, Small</Description>
    </LineItem>
    <LineItem>
      <ItemNumber>333224444</ItemNumber>
      <SKU>0000143214</SKU>
      <Cost>99.99</Cost>
      <Description>Big Ticket Item</Description>
    </LineItem>
    <LineItem>
      <ItemNumber>123456789</ItemNumber>
      <SKU>01121245245</SKU>
      <Cost>15.99</Cost>
      <Description>Widget Bundle, Large (10)</Description>
    </LineItem>
  </Body>
</PurchaseOrder>

... где дополнительную информацию можно получить, позвонив в другие службы.

Ниже приведено определение прокси-службы, которое я пытаюсь использовать, и обогащение за пределами итеративного посредника работает, как и ожидалось. Это обогащающий посредник внутри итеративного посредника, который работает не так, как я ожидал. У меня сложилось впечатление, что я должен был использовать совокупный посредник, чтобы связать все воедино.

Я рассмотрел примеры WSO2 и Synapse для такой проблемы, и все они предполагают, что вы используете итеративный посредник с посредником отправки для вызова других служб, что отличается от того, что я здесь делаю.

Определение прокси-сервиса:

<proxy xmlns="http://ws.apache.org/ns/synapse" name="DSS_MockPOC" transports="https,http" statistics="enable" trace="enable" startOnLoad="true">
   <target>
      <inSequence>
         <property xmlns:ex="http://example.com/samples" name="VendorNumber" expression="//ex:PurchaseOrder/ex:Header/ex:VendorData/ex:VendorNumber" scope="default" type="STRING"/>
         <callout serviceURL="local:///services/Mock_TermsLookup/" action="urn:mediate">
            <source type="envelope"/>
            <target key="TermsResponse"/>
         </callout>
         <enrich>
            <source clone="true" xpath="synapse:get-property('TermsResponse')"/>
            <target xmlns:ex="http://example.com/samples" action="sibling" xpath="//ex:PurchaseOrder/ex:Header/ex:VendorData"/>
         </enrich>
         <iterate xmlns:ex="http://example.com/samples" continueParent="true" id="LineItemIterator" preservePayload="true" attachPath="//ex:PurchaseOrder/ex:Body" expression="//ex:PurchaseOrder/ex:Body/ex:LineItem" sequential="true">
            <target>
               <sequence>
                  <property name="ItemLookupRequest" expression="$body" scope="default" type="OM"/>
                  <callout serviceURL="local:///services/Mock_ItemLookup/" action="urn:mediate">
                     <source key="ItemLookupRequest"/>
                     <target key="ItemLookupResponse"/>
                  </callout>
                  <enrich>
                     <source type="property" clone="true" property="ItemLookupResponse"/>
                     <target xpath="//ex:LineItem"/>
                  </enrich>
               </sequence>
            </target>
         </iterate>
         <aggregate id="LineItemIterator">
            <correlateOn xmlns:ex="http://example.com/samples" expression="//ex:PurchaseOrder/ex:Header"/>
            <completeCondition>
               <messageCount min="-1" max="-1"/>
            </completeCondition>
            <onComplete xmlns:ex="http://example.com/samples" expression="//ex:PurchaseOrder/ex:Body/ex:LineItem">
               <log level="full"/>
            </onComplete>
         </aggregate>
         <property name="RESPONSE" value="true" scope="default" type="STRING"/>
         <header name="To" action="remove"/>
         <send/>
      </inSequence>
   </target>
   <description></description>
</proxy>

Наконец, это то, что я сейчас получаю, когда звоню в эту службу. Через ведение журнала я вижу, что итерационный посредник отправляет и получает правильную информацию; результаты просто не передаются в ответное сообщение.

<PurchaseOrder xmlns="http://example.com/samples">
   <Header>
      <VendorData>
         <VendorNumber>123456</VendorNumber>
      </VendorData>
      <VendorTerms>
         <Discount>
            <Description>15 % NET 10</Description>
            <DiscountDays>10</DiscountDays>
         </Discount>
         <Days>30</Days>
         <TermsID>001</TermsID>
      </VendorTerms>
   </Header>
   <Body>
      <LineItem>
         <ItemNumber>111222333</ItemNumber>
      </LineItem>
      <LineItem>
         <ItemNumber>333224444</ItemNumber>
      </LineItem>
      <LineItem>
         <ItemNumber>123456789</ItemNumber>
      </LineItem>
   </Body>
</PurchaseOrder>

0 ответов

Другие вопросы по тегам