2017-01-27 36 views
0

我想写下一个目标动作序列: 1.呼叫DSS接收客户列表 2.通过单独呼叫另一个DSS服务来丰富每个客户的。wso2esb迭代通过wso2dss结果

所以,我想我应该调用标注调解器,然后使用迭代器迭代它的结果。但我不明白我应该在迭代器中写什么。

还有一个问题 - 我是否正确,每次迭代的结果都会附加在'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年1月27日10: 17:17,371] INFO - LogMediator To:,MessageID:urn:uuid:d628e361-beb8- 4c26-b06d-3901227ad76a,方向:请求,文本=开始批处理seq [2017-01-27 10:17:18,558] INFO - LogMediator To:,MessageID:urn:uuid:d628e361-beb8-4c26-b06d-3901227ad76a, Direction:request,text = 1Customer#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年1月27日10:17:18559] WARN - 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 我想出一个主要问题 - 标注调停犯规”把应对信封上下文(如果我理解的话)。所以,我们不能只使用属性来将它与迭代器连接起来,所以在这种情况下,我们应该使用像Payload工厂这样的smth连接它们。不是很有用 如果smbdy知道如何做到这一点更简单(直接将迭代器传递给属性) - 请写信给我。 解决方案 - 使用Call Medator。工作正常。

谢谢大家!在DSS响应

+0

如果两个DSS服务都位于同一个DSS服务器中,我认为最好的方法是直接在那里进行充实,使用ESB只是为了任何最终的转换和/或添加QoS功能。在ESB中进行充实意味着会有与多个呼叫相关的大量开销。在DSS上做这件事,也会有开销,但由于每个客户都没有往返,因此它会更小。 –

+0

当然你是对的! 但这只是为了教育目的,我正在探索WSO - 是否有可能在我们的集成项目中使用) – PVN

回答

0

XML节点属于一个命名空间“crm.crm.crm”,你必须用迭代mediatior是指它在你的XPath

,如果你想保留源有效载荷,你必须使用一个属性命名为preservePayload =“true”,并告诉在哪里必须使用attachPath属性附加xml分档,在interate的序列中,只能在肥皂主体中包含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> 

默认情况下,迭代后的中介将不会执行。如果要继续调解,请使用属性continueParent =“true”

+0

亲爱的让 - 米歇尔, 不幸的是不工作(( 我改变了日志信息,输出..所以,看起来像在xpath有一些错误。试图找到它,会很高兴你的帮助 – PVN

+0

找到了一些奇怪的,但工作方式,你能估计 - 这是否正确? 我会添加它在 – PVN

+0

我无法用dss测试,但是我已经将您在问题中共享的soap消息发送给了我的ESB和SoapUI,并且没有任何payloadFactory调解器,它完美地工作。使用就在iterate mediator之前,看看有效载荷是什么样的,并调整你在iterate mediator中使用的xpath:你不应该使用payloadFactory –