我们从文件系统处理XML文件,一旦处理完毕,它们将被移动到另一个目录。另一个系统监视此输出文件夹并获取所有新创建的文件以供进一步处理。
如果我们定义moveToPattern和moveToDirecory属性,输入文件将首先复制到目标,然后从输入文件夹中删除。这适用于小文件,但在大文件上需要更长时间,导致输出文件夹上的文件不完整几秒钟。
我们的解决方案是让文件以.tmp扩展名复制,然后将其重命名为最终名称并删除输入文件。
所以Flow如下所示:
输入文件 - >处理 - >带有.tmp的输出文件 - >重命名 - >删除输入文件
问题是通过使用此自定义转换器在文件之后重命名文件:端点流程保持活动状态,并且所有消息都不会被垃圾回收并导致OutOfMemory异常。 内存转储显示了大量的DefaultMuleMessage对象,证明了我的假设。
有没有人想要解决这个问题?
<file:connector name="inputFileConnector" autoDelete="false" doc:name="File" streaming="true" validateConnections="true" />
<file:connector name="temporaryFileOutputConnectorConfig" outputPattern="#[message.outboundProperties['transportFileName']].tmp" autoDelete="false" streaming="false" validateConnections="true" doc:name="File" />
<file:endpoint path="${outputDir}/${queuePrefix}#[message.outboundProperties.'queue_number' ]/#[message.outboundProperties.'approvalSubDir']" name="OutputConnectorEndpoint" responseTimeout="10000" doc:name="File"/>
<flow name="Queue_Flow" processingStrategy="synchronous" initialState="stopped" >
<file:inbound-endpoint path="${inputDir}" responseTimeout="10000" pollingFrequency="5000" connector-ref="inputFileConnector" doc:name="File">
.
.
.
<flow-ref name="OutStrategyFile" doc:name="Out Strategy File"/>
</flow>
<sub-flow name="OutStrategyFile">
<file:outbound-endpoint connector-ref="temporaryFileOutputConnectorConfig" responseTimeout="10000" ref="OutputConnectorEndpoint" doc:name="Write temporary file"/>
<custom-transformer class="com.fileutil.FileRenamer" doc:name="Rename file to final location">
<spring:property name="fileUtils" ref="fileUtils"/>
</custom-transformer>
<custom-transformer class="com.fileutil.DeleteOriginalInputMessage" doc:name="Delete Original input message"/>
</sub-flow>