我正在尝试写一个大的CSV文件到SFTP。用于通过SFTP连接器对记录进行拆分和写入。但是文件没有到达SFTP。我哪里做错了?
下面是流程:
<flow name="sftp-Flow" doc:id="294e7265-0bb3-466b-add4-5819088bd33c">
<file:listener doc:name="File picked from path" directory="${processing.folder}" config-ref="File-Inbound" autoDelete="true" matcher="filename-regex-filter" doc:id="bbfb12df-96a4-443f-a137-ef90c74e7de1" outputMimeType="application/csv" primaryNodeOnly="true" timeBetweenSizeCheck="1" timeBetweenSizeCheckUnit="SECONDS">
<repeatable-in-memory-stream initialBufferSize="1" bufferSizeIncrement="1" maxBufferSize="500" bufferUnit="MB"/>
<scheduling-strategy>
<fixed-frequency frequency="${file.connector.polling.frequency}"/>
</scheduling-strategy>
</file:listener>
<set-variable value="#[attributes.fileName]" doc:name="fileName - Variable" doc:id="5f064507-be62-4484-86ea-62d6cfb547fc" variableName="fileName"/>
<foreach doc:name="For Each" doc:id="87b79f6d-1321-4231-bc6d-cffbb859d94b" batchSize="500" collection="#[payload]">
<sftp:write doc:name="Push file to SFTP" doc:id="d1562478-5276-4a6f-a7fa-4a912bb44b8c" config-ref="SFTP-Connector" path='#["${sftp.remote.folder}" ++ "/" ++ vars.fileName]' mode="APPEND">
<reconnect frequency="${destination.sftp.connection.retries.delay}" count="${destination.sftp.connection.retries}"/>
</sftp:write>
</foreach>
<error-handler ref="catch-exception-strategy"/>
我已经找到解决办法了。foreach
指令只支持JSON、XML和JSON格式的集合。我只是在foreach
之前放置了一个转换器来将CSV转换为JSON。现在文件被正确地批量保存。
尝试将CSV阅读器设置为流模式,而不是在记录中分割有效负载。
outputMimeType="application/csv; streaming=true"
:最好的解决方案可能只是从File侦听器中删除foreach和outputMimeType属性。该文件将作为二进制文件进行读写,使用流式传输到SFTP写入操作。删除outputMimeType将阻止Mule尝试将大文件解析为CSV,这并不是真正需要的,因为流作为CSV所做的唯一处理是foreach,这将不再需要。这种方法将更快,消耗更少的资源。