【发布时间】:2018-10-29 21:41:39
【问题描述】:
我正在研究 WSO2 EIP 模式,我对阅读 splitter 模式的官方文档有一些疑问 (https://docs.wso2.com/display/IntegrationPatterns/Splitter)
从理论上讲,我很清楚,我对示例提出的实现有些怀疑。
它正在定义这个代理,其中包含一个实现 splitter 模式的序列:
<definitions xmlns="http://ws.apache.org/ns/synapse">
<proxy name="SplitMessageProxy" transports="http https" startOnLoad="true">
<target>
<inSequence>
<log level="full"/>
<iterate xmlns:m0="http://services.samples"
preservePayload="true"
attachPath="//m0:getQuote"
expression="//m0:getQuote/m0:request">
<target>
<sequence>
<send>
<endpoint>
<address uri="http://localhost:9000/services/SimpleStockQuoteService"/>
</endpoint>
</send>
</sequence>
</target>
</iterate>
</inSequence>
<outSequence>
<drop/>
</outSequence>
</target>
<publishWSDL uri="file:repository/samples/resources/proxy/sample_proxy_1.wsdl"/>
</proxy>
<sequence name="fault">
<log level="full">
<property name="MESSAGE" value="Executing default "fault" sequence"/>
<property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/>
<property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/>
</log>
<drop/>
</sequence>
<sequence name="main">
<in/>
<out/>
</sequence>
</definitions>
然后这个 SOAP 请求 被发送到之前的代理:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.samples" xmlns:xsd="http://services.samples/xsd">
<soapenv:Header/>
<soapenv:Body>
<ser:getQuote>
<ser:request>
<xsd:symbol>IBM</xsd:symbol>
</ser:request>
<ser:request>
<xsd:symbol>WSO2</xsd:symbol>
</ser:request>
<ser:request>
<xsd:symbol>IBM</xsd:symbol>
</ser:request>
</ser:getQuote>
</soapenv:Body>
</soapenv:Envelope>
好的,所以 Iterate mediator 获取在其 XPath 表达式中指定的元素的每个子元素,并在迭代器中介器内应用序列流......所以在这种情况下,它会迭代所有XPATH 表达式 的子代由://m0:getQuote/m0:request 定义,应该是以下 XML 标记:
<xsd:symbol>IBM</xsd:symbol>
和
<xsd:symbol>WSO2</xsd:symbol>
和
<xsd:symbol>IBM</xsd:symbol>
对这个XPATH表达式的疑问是:
XPATH 表达式是 //m0:getQuote/m0:request。为什么在这个例子中它在 XML 元素之前附加 m0 命名空间?为什么表达式不是 //ser:getQuote/ser:request(使用进入 ESB 流的 XML 请求中定义的命名空间)?
【问题讨论】:
标签: jakarta-ee wso2 wso2esb esb