2015-11-11 44 views
2

尝试使用Mule XML流功能来处理非常大的xml文件。遵循文档,文档没有具体的例子。Mule XML Streaming - (Mule xmltoxmltransformation)

当我检查有效负载时,我得到了XMLUtils类,而不是文档中所述的XMLStreamReader类。

流程如下有一个文件连接器,它将有效载荷传递给一个自定义变换器,变换器将数据传递给将要基于事件处理的spring bean。

春豆。在运行时,sp​​ring bean获取XMLUtils类而不是XMLStreamReader类。

骡子 - 配置:

<spring:beans> 
    <spring:bean id="OracleCDMMapper" class="oraclecdmstream.OracleCDMMapper"> 
</spring:bean> 
<spring:bean id = "OraclePaySlip" class="com.nect.transform.OracleCDMPaySlip" ></spring:bean> 

</spring:beans> 

<flow name="mulefileconnectorexampleFlow1" > 
     <file:inbound-endpoint path="C:/c-OracleCloud/src/main/resources" pollingFrequency="600000" moveToDirectory="C:/c-OracleCloud/src/main/resources/back" doc:name="File Input" > 
      <!-- <file:filename-regex-filter pattern="(^*.xml$)" caseSensitive="false"/> 
-->   <file:filename-wildcard-filter pattern="*.xml"></file:filename-wildcard-filter> 
     </file:inbound-endpoint> 
     <logger message="Transferring file : #[message.inboundProperties['originalFilename']]" level="INFO" doc:name="Logger"/> 
     <logger message ="Logger 1 " level="INFO" doc:name ="Logger1" /> 
     <!-- Call the XMLSTREAMER --> 
     **<custom-transformer name="XmlToXSR" class="org.mule.module.xml.transformer.XmlToXMLStreamReader" doc:name="XMLTOORACLE">** 

     </custom-transformer> 

     <component doc:name="Java"> 
       <spring-object bean="OracleCDMMapper"/> 
     </component> 


    -->  
     <logger message ="I am Complete " level="INFO" doc:name ="LoggerMurali" /> 


    </flow> 


</mule> 

这里是Javacode:

Spring Bean 
public class OracleCDMMapper implements Callable { 

    private final Logger logger = LoggerFactory.getLogger(OracleCDMMapper.class); 

    @Override 
    public Object onCall(MuleEventContext eventContext) throws Exception { 
     // TODO Auto-generated method stub 

     MuleMessage muleMessage = eventContext.getMessage(); 

     logger.info("In the Spring Component"); 

     logger.info(muleMessage.getPayload().getClass().toString()); 


     **javax.xml.stream.XMLStreamReader xsr = (XMLStreamReader) muleMessage.getPayload(javax.xml.stream.XMLStreamReader.class);** 

任何帮助将非常感激

+0

您确定您正在获取XMLUtils的实例吗?在源代码中有几个地方我发现它会返回一个确实实现XMLStreamReader的匿名内部类。如果你在类上使用toStriing(),这将看起来像XMLUtils $ 2。也许还可以尝试记录getClass()。getName()或getFullName()。 –

回答

1

我已经验证了,你是对的,在代码中应该返回的类应该是DelegateXMLStreamReader类实现XMLStreamReader,但返回的类是一个匿名内部类XMLUtils在运行时不能像类一样流到任何Stream。这似乎是一个缺陷。

如果你真的需要XML流的控制,你可以使用自定义的Java组件:

<component class="com.foo.CustomJavaComponent" doc:name="Java"/> 

public class CustomJavaComponent implements Callable{ 

    @Override 
    public Object onCall(MuleEventContext eventContext) throws Exception { 
     MuleMessage muleMessage = eventContext.getMessage(); 

     FileInputStream fis = (FileInputStream)muleMessage.getPayload(); 
     //Do something with this stream 

     return "Hello world"; 
    } 
} 

,并获得输入流做任何你想要的。

+0

感谢您的更新,我正在转向自定义组件 – user5549845