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