【问题标题】:File handling when streaming data from CSV从 CSV 流式传输数据时的文件处理
【发布时间】:2016-08-19 02:27:25
【问题描述】:

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

目前,我收到以下错误:“作为文件移动操作的一部分,无法删除文件“C:\temp\input\inputCSV.csv”。由于在文件连接器。”

更改 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>

【问题讨论】:

    标签: csv mule mule-studio mule-component


    【解决方案1】:

    在流模式下,Mule 将使用ReceiverFileInputStream 包装流。当流关闭时,它将负责文件的删除或移动。这就是重点,您不应该在输入流上调用 close 。每当遇到 EOF 时,流本身都会调用它。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        您应该在文件连接器本身中使用object-to-byte-array 转换器。它会在读取输入流后关闭流。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-28
          • 1970-01-01
          • 2014-05-04
          • 1970-01-01
          • 2011-07-06
          相关资源
          最近更新 更多