从CSV流式传输数据时的文件处理

时间:2014-11-25 11:14:59

标签: csv mule mule-studio mule-component

我有一个简单的mule流,它将csv文件流式传输到自定义java组件。我需要能够处理大文件,所以不要使用将文件读取到内存的Transformer。

目前,我收到以下错误:"无法删除文件" C:\ temp \ input \ inputCSV.csv"作为文件移动操作的一部分。该文件正在删除,因为在文件连接器上设置了AutoDelete。"

更改mule XML配置Autodelete =" false"并指定“已处理”的目标目录。文件导致类似的错误。有人可以告诉我如何流式传输文件并推迟自动删除直到文件被完全读取? 我在我的mule payloadStream上调用.close(),当我完成时,但是mule似乎太早完成了文件删除!

这是流程XML配置...



<?xml version="1.0" encoding="UTF-8"?>


<mule xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns="http://www.mulesoft.org/schema/mule/core"
    xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" version="CE-3.5.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd">


<spring:beans>
    <spring:import resource="classpath*:/spring/config.xml" />
	<spring:import resource="classpath*:/spring/extras/Rule-preprocessor-config.xml" />
</spring:beans>
        
    <file:connector name="fileInput" streaming="true"
        autoDelete="true" 
        moveToPattern="#[message.inboundProperties['originalFilename']]"
        doc:name="File">
        <!-- <service-overrides messageFactory="org.mule.transport.file.FileMuleMessageFactory" /> -->
    </file:connector>
    
    <flow name="stringflowFlow2x" doc:name="stringflowFlow2x">
    <file:inbound-endpoint connector-ref="fileInput"
            path="/temp/input" doc:name="inputCsv" responseTimeout="10000" fileAge="10000" />
        <component class="com.benji.FileImportPreProcessor" doc:name="JavaPreProcessorLogic"/>
        <logger message="Finished!" level="INFO" doc:name="Logger"/>
    </flow>

</mule>
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:2)

在流模式下,Mule将使用ReceiverFileInputStream包裹流。当流关闭时,它将处理文件删除或移动。这就是重点,你不应该在输入流上调用close。只要EOF被击中,流本身就会调用它。

答案 1 :(得分:1)

我对此略有不同:请参阅注意事项https://docs.mulesoft.com/mule-user-guide/v/3.6/file-transport-reference

  

如果启用了流式传输,则ReceiverFileInputStream将用作处理的每个文件的有效内容。此输入流的close()方法负责移动文件或删除文件。读取输入流的变换器关闭流。如果您在自己的组件实现中处理流,请确保在读取后正确关闭流。

因此我不认为mule会为你处理这个问题,除非你使用通常很有可能的变压器....但在我的情况下,一些初步验证意味着我甚至没有开始考虑有效载荷意味着我结束了转换有效负载之前的过程(因此不会读取和关闭文件流)

答案 2 :(得分:0)

你应该在文件连接器本身object-to-byte-array变换器。它将在读取输入流后关闭流。