1

csv ファイルをカスタム Java コンポーネントにストリーミングする単純なミュール フローがあります。大きなファイルを処理できるようにする必要があるため、ファイルをメモリに読み取る Transformer を使用したくありません。

現在、次のエラー が表示されます。

Mule XML 設定 Autodelete="false" を変更し、「処理済み」ファイルの宛先ディレクトリを指定すると、同様のエラーが発生します。ファイルをストリーミングして、ファイルが完全に読み取られるまで自動削除を延期する方法を教えてください。完了したら、ミュールのペイロードストリームで .close() を呼び出していますが、ミュールがファイルの削除を完了するのが早すぎるようです!

フローの 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>

4

3 に答える 3

1

私はこれを少し異なって理解しています: 考慮事項を参照してください https://docs.mulesoft.com/mule-user-guide/v/3.6/file-transport-reference

ストリーミングが有効になっている場合、処理される各ファイルのペイロードとして ReceiverFileInputStream が使用されます。この入力ストリームの close() メソッドは、ファイルの移動または削除を処理します。ストリームは、入力ストリームを読み取るトランスフォーマーによって閉じられます。独自のコンポーネント実装でストリームを処理する場合は、読み取り後にストリームを適切に閉じるようにしてください。

したがって、通常は非常に可能性の高いトランスフォーマーを使用しない限り、ミュールがこれを処理するとは思いません....しかし、私の場合、最初の検証は、ペイロードを考慮し始めていなかったことを意味し、変換する前にプロセスを終了していたことを意味しましたペイロード (したがって、ファイル ストリームを読み取ったり閉じたりしない)

于 2016-08-11T20:06:05.950 に答える