wso2esb遍历wso2dss结果
我想写下下下一个目标行动序列: 1.致电DSS以接收客户列表 2.通过单独呼叫另一个DSS服务丰富每个客户的服务 所以,我想我应该调用callout mediator,然后使用迭代器迭代它的结果。但是我不明白我应该在迭代器中写什么 还有一个问题——我说得对吗,每次迭代的结果都会附在“客户”标签下 详情: 从DSS返回的XML是下一个:wso2esb遍历wso2dss结果,wso2,wso2esb,wso2dss,Wso2,Wso2esb,Wso2dss,我想写下下下一个目标行动序列: 1.致电DSS以接收客户列表 2.通过单独呼叫另一个DSS服务丰富每个客户的服务 所以,我想我应该调用callout mediator,然后使用迭代器迭代它的结果。但是我不明白我应该在迭代器中写什么 还有一个问题——我说得对吗,每次迭代的结果都会附在“客户”标签下 详情: 从DSS返回的XML是下一个: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<customers xmlns="crm.crm.crm">
<customer>
<customerId>1</customerId>
<name>Customer #1</name>
<birthdate>2017-01-15T14:54:12.000+03:00</birthdate>
</customer>
</customers>
</soapenv:Body>
</soapenv:Envelope>
1.
客户#1
2017-01-15T14:54:12.000+03:00
顺序:
<?xml version="1.0" encoding="UTF-8"?>
<sequence name="BatchSequence" statistics="enable" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
<log description="">
<property name="text" value="Start batch seq"/>
</log>
<payloadFactory description="create dss request" media-type="xml">
<format>
<soapenv:Envelope xmlns:crm="crm.crm.crm" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<crm:getCustomers>
<crm:batchSize>3</crm:batchSize>
</crm:getCustomers>
</soapenv:Body>
</soapenv:Envelope>
</format>
<args/>
</payloadFactory>
<callout action="urn:getCustomers" description="dss: main object" initAxis2ClientOptions="false" serviceURL="http://192.168.3.32:9765/services/CrmDataService?wsdl">
<source type="envelope"/>
<target key="customers"/>
</callout>
<log description="">
<property expression="get-property('customers')" name="text"/>
</log>
<iterate description="Enrich customers" expression="/soapenv:Envelope/soapenv:Body/customers/customer" id="iterateId" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<target>
<sequence>
<property description="customerId" expression="/customerId" name="customerID" scope="default" type="STRING"/>
<log description="">
<property expression="get-property('customerID')" name="text"/>
</log>
</sequence>
</target>
</iterate>
<log description="">
<property name="text" value="End batch seq"/>
</log>
</sequence>
3.
输出:
[2017-01-27 10:17:17371]信息-日志调解人收件人:,消息ID:urn:uuid:d628e361-beb8-4c26-b06d-3901227ad76a,方向:请求,文本=开始批次顺序
[2017-01-27 10:17:18558]信息-日志调解人收件人:,消息ID:urn:uuid:d628e361-beb8-4c26-b06d-3901227ad76a,方向:请求,文本=1客户#12017-01-15T14:54:12.000+03:002Customer#22016-12-16T14:54:20.000+03:003Customer#32016-10-27T14:54:21.000+03:00
[2017-01-27 10:17:18559]警告-RuntimeStatisticCollector事件在事件收集完成后发生,事件-urn_uuid_D628; e361-beb8-4c26-b06d-3901227ad7
6a231160071781262
更新1
一些工作代码。我不确定这是否正确,因为我对这里的PayloadFactory有点困惑
<payloadFactory description="" media-type="xml">
<format>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>$1</soapenv:Body>
</soapenv:Envelope>
</format>
<args>
<arg evaluator="xml" expression="get-property('customers')"/>
</args>
</payloadFactory>
<iterate continueParent="true" description="" expression="$body/crm:customers/crm:customer" sequential="true" xmlns:crm="crm.crm.crm">
<target>
<sequence>
<property expression="//crm:customerId" name="customerID" scope="default" type="STRING"/>
<log>
<property expression="get-property('customerID')" name="text"/>
</log>
</sequence>
</target>
</iterate>
$1
更新2
我发现了一个主要问题——调出中介没有将响应放入信封上下文(如果我理解正确的话)。所以,我们不能仅使用属性将其与迭代器链接,因此,在本例中,我们应该使用类似smth的有效负载工厂来链接它们。不太饱
如果smbdy知道如何做得更简单(直接将属性传递给迭代器)-请写信给我。
解决方案-使用呼叫管理器。很好
谢谢大家 dss响应中的xml节点属于名称空间“crm.crm.crm”,您必须在xpath中引用它 使用iterate mediatior,如果要保留源有效负载,必须使用名为preservePayload=“true”的属性,并告诉xml框架必须在何处附加属性attachPath,否则,在interate的序列中,soap主体中将只包含xml片段 这是一个在不保留源有效负载的情况下工作的示例:
<iterate xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:crm="crm.crm.crm" expression="$body/crm:customers/crm:customer" id="iterateId">
<target>
<sequence>
<property expression="$body/crm:customer/crm:customerId" name="customerID" scope="default" type="STRING"/>
<log>
<property expression="get-property('customerID')" name="text"/>
</log>
</sequence>
</target>
</iterate>
默认情况下,不会执行迭代后的中介。如果要继续中介,请使用attribute continueParent=“true”如果两个DSS服务位于同一个DSS服务器中,我认为最好的方法是直接在那里进行扩展,使用ESB进行任何最终转换和/或添加QoS功能。在ESB上进行扩展意味着与多个调用相关的开销会很大。在DSS中执行此操作也会产生开销,但会更小,因为每个客户都没有往返行程。当然,您的回答是正确的!但这只是出于教育目的,我正在探索WSO-是否可以在我们的集成项目中使用)您可以使用嵌套查询。请查看此帖子亲爱的Jean Michel,不幸的是它不起作用((我将内部日志消息更改为常量-无输出..因此,xpath中似乎存在一些错误。尝试查找它时,将很高兴您的帮助发现一些奇怪但有效的方法,您能估计一下吗?是否正确?我将在主帖子中添加它。我无法使用dss进行测试,但我已将您在问题中共享的soap消息发送给我的ES。)B使用SoapUI,它在没有任何payloadFactory中介的情况下可以完美地工作。在iterate mediator之前使用它可以查看负载的确切外观,并调整iterate mediator中使用的xpath:您不必使用payloadFactoryJean Michel,我已经将level=FULL和sow设置为消息信封中的DSS。因此,我认为DSS调用应该是:美联社的回复不知何故在正文中?rthdate>2016-10-27T14:54:21.000+03:00,信封:crm:getCustomers>crm:batchSize>3我的意思是发现了一个问题!主要的问题是调用调解器。在将其更改为调用调解器后,一切正常!Jean-Michel,非常感谢,我对您的答案进行了评分,但由于我的低声誉,这些答案是看不见的(