Обработка файлов при потоковой передаче данных из CSV

У меня есть простой поток мулов, который передает CSV-файл в пользовательский компонент Java. Мне нужно иметь возможность обрабатывать большие файлы, поэтому я не хочу использовать Transformer, который считывает файл в память.

В настоящее время я получаю следующую ошибку: "Не удалось удалить файл "C:\temp\input\inputCSV.csv" как часть операции перемещения файла. Файл удалялся, так как на соединителе файлов было установлено автоудаление. "

Изменение XML-конфигурации мула Autodelete="false" и указание каталога назначения для "обработанного" файла приводит к аналогичной ошибке. Может ли кто-нибудь сказать мне, как передать файл в потоковом режиме и отложить автоудаление до тех пор, пока файл не будет полностью прочитан? Когда я закончу, я вызываю .close() для моего мула payloadStream, но мул, кажется, завершает удаление файла слишком рано!

Вот 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>


person kingBenny    schedule 25.11.2014    source источник


Ответы (3)


В потоковом режиме Mule оборачивает поток ReceiverFileInputStream. Он позаботится об удалении или перемещении файла, когда поток закрыт. И в этом суть, вы не должны вызывать закрытие входного потока. Сам поток будет вызывать его всякий раз, когда будет нажат EOF.

person Víctor Romero    schedule 20.12.2014

Я понимаю это немного по-другому: см. соображения https://docs.mulesoft.com/mule-user-guide/v/3.6/file-transport-reference

Если потоковая передача включена, ReceiverFileInputStream используется в качестве полезной нагрузки для каждого обрабатываемого файла. Метод close() этого входного потока позаботится о перемещении файла или его удалении. Потоки закрываются преобразователями, считывающими входной поток. Если вы обрабатываете поток в своей собственной реализации компонента, обязательно правильно закройте поток после чтения.

Поэтому я не думаю, что мул справится с этим за вас, если только вы не используете преобразователь, который обычно весьма вероятен... но в моем случае некоторая начальная проверка означала, что я даже не начал рассматривать полезную нагрузку, означающую, что я завершаю процесс перед преобразованием полезная нагрузка (и, следовательно, не чтение и закрытие файлового потока)

person user6706709    schedule 11.08.2016

Вы должны object-to-byte-array преобразовывать в самом файловом коннекторе. Он позаботится о закрытии потока после чтения входного потока.

person Swati Vatyani    schedule 18.08.2016