Synapse/WSO2:使用迭代中介修改代理服务中的消息

Synapse/WSO2:使用迭代中介修改代理服务中的消息,wso2,synapse,Wso2,Synapse,以下是我试图解决的问题: 收到消息 通过调用另一个服务来获取信息来丰富消息(另一个服务恰好是WSO2数据服务,但使用模拟代理的效果相同);有关丰富模式的信息,请参见 在途中发送消息 输入消息如下所示: <PurchaseOrder xmlns="http://example.com/samples"> <Header> <VendorData> <VendorNumber>123456</VendorNumber>

以下是我试图解决的问题:

  • 收到消息
  • 通过调用另一个服务来获取信息来丰富消息(另一个服务恰好是WSO2数据服务,但使用模拟代理的效果相同);有关丰富模式的信息,请参见
  • 在途中发送消息
  • 输入消息如下所示:

    <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>
    
    
    123456
    111222333
    333224444
    123456789
    
    。。。输出消息应如下所示:

    <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>
    
    
    123456
    净价15%10
    10
    30
    001
    111222333
    ABC123PDQ789
    9.99
    小部件
    333224444
    0000143214
    99.99
    高价商品
    123456789
    01121245245
    15.99
    小部件包,大(10)
    
    。。。通过调用其他服务获取附加信息

    下面是我正在尝试的代理服务定义,迭代中介器之外的enrich中介器按预期工作。迭代中介中的充实中介没有像我预期的那样工作。我的印象是,我必须使用一个聚合调解人来将所有事情联系起来

    我已经查看了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>
    
    
    123456
    净价15%10
    10
    30
    001
    111222333
    333224444
    123456789
    
    Tom,您使用callout而不发送服务呼叫有什么具体原因吗?我(可能不正确)的理解是,这是对消息进行充实的方式。我如何使用send中介来做同样的事情?