我想写下一个目标操作序列: 1.调用DSS接收客户列表;2.通过单独调用另一个DSS服务丰富每个客户的服务。
所以,我想我应该调用callout中介,然后使用迭代器迭代它的结果。但是我不明白我应该在迭代器中写什么。
还有另一个问题--我说得对吗?每一次迭代的结果都会附加在“customer”标签下吗?
详细信息:
下一个是从DSS返回的XML:
<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>顺序:
<?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>产出:
2017-01-27 10:17:17 371 INFO - LogMediator To:,MessageID: LogMediator :LogMediator,text = Start batch seq 2017-01-27 10:17:18,558 INFO -LogMediator To:,MessageID: LogMediator: request,文本=1 1Customer #12017-01-15T14:54:12.000+03:002 1Customer#22016-12-16T14:54:20.000+03:003 1Customer #32016-10-27T14:54:21.000+03:00 2017-01-27 10:00 2017-01 10:17:18 559警告- RuntimeStatisticCollector事件在事件收集完成后发生,事件- urn_uuid_d628e361-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>更新2我发现了一个主要的问题--标注中介没有将响应放到信封上下文中(如果我理解正确的话)。因此,我们不能只使用属性将其与迭代器链接,因此,在这种情况下,我们应该使用smth (比如Payload工厂)将它们链接起来。不是很难看,如果smbdy知道如何做到更简单(dirrect将属性传递给迭代器)--请写信给我。解决方案-使用电话会议。效果很好。
感谢大家!
发布于 2017-01-27 08:34:56
dss响应中的xml节点属于名称空间"crm.crm.crm“,您必须在xpath中引用它。
使用迭代中介器,如果您希望保留源有效负载,则必须使用名为preservePayload="true“的属性,并指出xml框架必须与属性attachPath附加在哪里,或者在interate的序列中,您只能将xml片段放在soap主体中。
这是一个在不保留源有效负载的情况下工作的示例:
<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>默认情况下,迭代后的中介程序不会被执行。如果要继续中介,请使用属性continueParent="true“
https://stackoverflow.com/questions/41888871
复制相似问题