Mule ESB 3.6 - 将 BufferedInputStream 转换为 XML 的最佳方式
Mule ESB 3.6 - Best way to convert BufferedInputStream to XML
我有一个使用 HTTP 连接器的 Mule ESB 项目,我想在其中使用 XPath split/route XML。
HTTP 连接器之后的消息负载是 org.glassfish.grizzly.utils.BufferInputStream。
将其转换为可以使用组件(例如 'Splitter' 或 'Expression'(使用 XPath)到 split/route 的类型的最佳方法是什么?
'Object to XML' 似乎不起作用,当有效负载是字符串时拆分器不起作用(即在 HTTP 之后使用对象到字符串)。如果有标准组件可以做到这一点,我宁愿不编写自定义 Java 转换器?
流量
<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
<file:connector name="File" autoDelete="true" streaming="true" validateConnections="true" doc:name="File"/>
<flow name="collectionsplitterFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/CollectionSplitter" doc:name="HTTP"/>
<splitter expression="#[xpath3('//Order')]" doc:name="Splitter"/>
<logger level="INFO" doc:name="Logger"/>
</flow>
XML拆分
<?xml version="1.0" encoding="UTF-8"?>
<msglist>
<msg>
<Order>
<Id>1</Id>
<Description>Order 1</Description>
</Order>
</msg>
<msg>
<Order>
<Id>2</Id>
<Description>Order 2</Description>
</Order>
</msg>
</msglist>
谢谢
大卫
你的流程看起来不错。我在我的机器上试过了,我知道你来自哪里。尝试将 Mule 表达式从#[xpath3('//Order')] 更改为#[xpath('//Order')]。这样做会导致 Mule 成功生成两条 Mule 消息 - 每个 Order 元素一条。
HTH,
贾斯汀
感谢这个的回答帮助我解决了问题。
答案:
将 NODESET 选项添加到 xpath3 MEL,然后将 DOM 添加到 XML 转换器以将 DOM 对象转换回 XML。
#[xpath3('//Order',payload,'NODESET')]
我还必须将所有拆分组件添加到一个子流中,尤其是对于我的 HTTP 源(因为我不断收到 payloadAsString() 错误。
骡子流
<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
<file:connector name="File" autoDelete="true" streaming="true" validateConnections="true" doc:name="File"/>
<file:connector name="PickupFile2" autoDelete="true" streaming="false" validateConnections="true" doc:name="File"/>
<mulexml:object-to-xml-transformer returnClass="java.lang.String" encoding="UTF-8" name="Object_to_XML" doc:name="Object to XML"/>
<mulexml:dom-to-xml-transformer name="DOM_to_XML" doc:name="DOM to XML"/>
<flow name="collectionsplitterFlow2">
<http:listener config-ref="HTTP_Listener_Configuration" path="/CollectionSplitter" doc:name="HTTP"/>
<set-session-variable variableName="Filename" value="HTTP" doc:name="Session Variable"/>
<flow-ref name="collectionsplitterSub_Flow" doc:name="collectionsplitterSub_Flow"/>
<set-payload value="Response2" doc:name="Set Payload"/>
</flow>
<sub-flow name="collectionsplitterSub_Flow">
<splitter expression="#[xpath3('//Order',payload,'NODESET')]" doc:name="Splitter"/>
<mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
<file:outbound-endpoint path="C:\Mule\CollectionSplitter\Backup_SplitFile" outputPattern="#[sessionVars.Filename]-split2-#[function:datestamp].xml" connector-ref="File" responseTimeout="10000" transformer-refs="DOM_to_XML" doc:name="File"/>
</sub-flow>
<flow name="collectionsplitterFlow">
<file:inbound-endpoint path="C:\Mule\CollectionSplitter\In" moveToPattern="#[message.inboundProperties['originalFilename']]-backup-#[function:datestamp].xml" moveToDirectory="C:\Mule\CollectionSplitter\Backup" connector-ref="PickupFile2" responseTimeout="10000" doc:name="File">
<file:filename-regex-filter pattern="(.*).xml" caseSensitive="false"/>
</file:inbound-endpoint>
<set-session-variable variableName="Filename" value="#[message.inboundProperties['originalFilename']]" doc:name="Session Variable"/>
<flow-ref name="collectionsplitterSub_Flow" doc:name="collectionsplitterSub_Flow"/>
<logger level="INFO" doc:name="Logger" message="#[payload]"/>
</flow>
我有一个使用 HTTP 连接器的 Mule ESB 项目,我想在其中使用 XPath split/route XML。
HTTP 连接器之后的消息负载是 org.glassfish.grizzly.utils.BufferInputStream。
将其转换为可以使用组件(例如 'Splitter' 或 'Expression'(使用 XPath)到 split/route 的类型的最佳方法是什么?
'Object to XML' 似乎不起作用,当有效负载是字符串时拆分器不起作用(即在 HTTP 之后使用对象到字符串)。如果有标准组件可以做到这一点,我宁愿不编写自定义 Java 转换器?
流量
<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
<file:connector name="File" autoDelete="true" streaming="true" validateConnections="true" doc:name="File"/>
<flow name="collectionsplitterFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/CollectionSplitter" doc:name="HTTP"/>
<splitter expression="#[xpath3('//Order')]" doc:name="Splitter"/>
<logger level="INFO" doc:name="Logger"/>
</flow>
XML拆分
<?xml version="1.0" encoding="UTF-8"?>
<msglist>
<msg>
<Order>
<Id>1</Id>
<Description>Order 1</Description>
</Order>
</msg>
<msg>
<Order>
<Id>2</Id>
<Description>Order 2</Description>
</Order>
</msg>
</msglist>
谢谢 大卫
你的流程看起来不错。我在我的机器上试过了,我知道你来自哪里。尝试将 Mule 表达式从#[xpath3('//Order')] 更改为#[xpath('//Order')]。这样做会导致 Mule 成功生成两条 Mule 消息 - 每个 Order 元素一条。
HTH,
贾斯汀
感谢这个
答案:
将 NODESET 选项添加到 xpath3 MEL,然后将 DOM 添加到 XML 转换器以将 DOM 对象转换回 XML。
#[xpath3('//Order',payload,'NODESET')]
我还必须将所有拆分组件添加到一个子流中,尤其是对于我的 HTTP 源(因为我不断收到 payloadAsString() 错误。
骡子流
<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
<file:connector name="File" autoDelete="true" streaming="true" validateConnections="true" doc:name="File"/>
<file:connector name="PickupFile2" autoDelete="true" streaming="false" validateConnections="true" doc:name="File"/>
<mulexml:object-to-xml-transformer returnClass="java.lang.String" encoding="UTF-8" name="Object_to_XML" doc:name="Object to XML"/>
<mulexml:dom-to-xml-transformer name="DOM_to_XML" doc:name="DOM to XML"/>
<flow name="collectionsplitterFlow2">
<http:listener config-ref="HTTP_Listener_Configuration" path="/CollectionSplitter" doc:name="HTTP"/>
<set-session-variable variableName="Filename" value="HTTP" doc:name="Session Variable"/>
<flow-ref name="collectionsplitterSub_Flow" doc:name="collectionsplitterSub_Flow"/>
<set-payload value="Response2" doc:name="Set Payload"/>
</flow>
<sub-flow name="collectionsplitterSub_Flow">
<splitter expression="#[xpath3('//Order',payload,'NODESET')]" doc:name="Splitter"/>
<mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
<file:outbound-endpoint path="C:\Mule\CollectionSplitter\Backup_SplitFile" outputPattern="#[sessionVars.Filename]-split2-#[function:datestamp].xml" connector-ref="File" responseTimeout="10000" transformer-refs="DOM_to_XML" doc:name="File"/>
</sub-flow>
<flow name="collectionsplitterFlow">
<file:inbound-endpoint path="C:\Mule\CollectionSplitter\In" moveToPattern="#[message.inboundProperties['originalFilename']]-backup-#[function:datestamp].xml" moveToDirectory="C:\Mule\CollectionSplitter\Backup" connector-ref="PickupFile2" responseTimeout="10000" doc:name="File">
<file:filename-regex-filter pattern="(.*).xml" caseSensitive="false"/>
</file:inbound-endpoint>
<set-session-variable variableName="Filename" value="#[message.inboundProperties['originalFilename']]" doc:name="Session Variable"/>
<flow-ref name="collectionsplitterSub_Flow" doc:name="collectionsplitterSub_Flow"/>
<logger level="INFO" doc:name="Logger" message="#[payload]"/>
</flow>