我想要完成的流程的简化版本是我将拥有应该按顺序处理的文件集,并且仅作为完整集。为了概念验证,我创建了一个流程来收集一组名为" File1 * YYMMDD * .txt"和" File2 * YYMMDD * .txt"这将构成日期 YYMMDD 的集合。我使用文件inbound-endpoint来监视文件,并使用名称的日期部分来定义相关ID。然后,集合聚合器将这些组合成一组2和一个文件出站,然后从集合中调度文件:
<configuration>
<default-threading-profile doThreading="false" />
</configuration>
<flow name="Aggregator">
<file:inbound-endpoint path="G:/SourceDir" moveToDirectory="G:/SourceDir/Archive"
responseTimeout="10000" doc:name="get-working-files"
pollingFrequency="5000" fileAge="600000">
<file:filename-regex-filter pattern="File1(.*).txt|File2(.*).txt" caseSensitive="false"/>
<message-properties-transformer>
<add-message-property key="MULE_CORRELATION_GROUP_SIZE" value="2" />
<add-message-property key="MULE_CORRELATION_ID"
value="#[message.inboundProperties
.originalFilename
.substring(5, message.inboundProperties.originalFilename.lastIndexOf('.'))]" />
</message-properties-transformer>
</file:inbound-endpoint>
<collection-aggregator timeout="86400000" failOnTimeout="false" doc:name="Collection Aggregator">
</collection-aggregator>
<foreach doc:name="For Each">
<logger message="Processing: #[message.inboundProperties.originalFilename]" level="INFO"
doc:name="Some process"/>
<file:outbound-endpoint responseTimeout="10000" doc:name="Destination"
outputPattern="#[function:datestamp:yyyyMMdd.HHmmss].#[message.inboundProperties.originalFilename]"
path="G:/DestDir"/>
</foreach>
</flow>
我遇到的问题有两个方面。
1)如果我只有一个文件集,例如File2150102.txt,则流程正确识别该集合不完整并等待。大约1分钟后,文件再次锁定,并被接受为集合中的第二个文件。该文件通过出站端点处理并存档,然后第二次再次尝试该文件并因文件已被删除而失败:
INFO 2015-07-14 11:19:51,205 [[fileset] .connector.file.mule.default.receiver.01] org.mule.transport.file.FileMessageReceiver:在文件中获取的锁:G:\ SourceDir \ File2150102.txt INFO 2015-07-14 11:21:01,241 [[fileset] .connector.file.mule.default.receiver.01] org.mule.transport.file.FileMessageReceiver:在文件上获取的锁:G:\ SourceDir \ File2150102。文本 INFO 2015-07-14 11:21:01,273 [[fileset] .connector.file.mule.default.receiver.01] org.mule.api.processor.LoggerMessageProcessor:处理:File2150102.txt INFO 2015-07-14 11:21:01,304 [[fileset] .connector.file.mule.default.receiver.01] org.mule.lifecycle.AbstractLifecycleManager:Initialising:&#39; connector.file.mule.default。 dispatcher.452370795&#39 ;.对象是:FileMessageDispatcher INFO 2015-07-14 11:21:01,304 [[fileset] .connector.file.mule.default.receiver.01] org.mule.lifecycle.AbstractLifecycleManager:Starting:&#39; connector.file.mule.default。 dispatcher.452370795&#39 ;.对象是:FileMessageDispatcher INFO 2015-07-14 11:21:01,320 [[fileset] .connector.file.mule.default.receiver.01] org.mule.transport.file.FileConnector:将文件写入:G:\ DestDir \ 20150714.112101.File2150102 。文本 WARN 2015-07-14 11:21:01,336 [[fileset] .connector.file.mule.default.receiver.01] org.mule.transport.file.ReceiverFileInputStream:无法从G:\ SourceDir \ File2150102移动文件。 txt到G:\ SourceDir \ archive \ File2150102.txt
INFO 2015-07-14 11:21:01,336 [[fileset] .connector.file.mule.default.receiver.01] org.mule.api.processor.LoggerMessageProcessor:处理:File2150102.txt INFO 2015-07-14 11:21:01,336 [[fileset] .connector.file.mule.default.receiver.01] org.mule.transport.file.FileConnector:将文件写入:G:\ DestDir \ 20150714.112101.File2150102 。文本 WARN 2015-07-14 11:21:01,476 [[fileset] .connector.file.mule.default.receiver.01] org.mule.transport.file.FileMessageReceiver:尝试删除文件G:\ SourceDir \ File2150102失败。正在处理的文件列表中的txt
我找不到控制此迭代再次抓取文件的设置,我的轮询频率设置为5秒,我需要10分钟的文件年龄,并且给予收集超时很长的10天所以它应该等待,直到找到另一个文件,但我不希望它再次获取同一个文件。
2)在更复杂的情况下,我有文件:目录中的File1150201.txt,File2150201.txt,File1150202.txt,File1150203.txt和File2150203.txt。流程开始抓取文件,正确查找并处理&#34; 150201&#34;并派遣它。它找到150202的文件,识别它需要第二个文件并且不处理它。然后它找到&#34; 150203&#34;的完整集合。并确实处理它。我需要它直到&#34; 150202&#34;集已经处理完毕。有人能告诉我如何让它等待不完整的设置而不是继续其他设置吗?我有正确的处理顺序,只是没有等待丢失文件的能力,并且如果有不完整的集合,则保持序列顺序。
答案 0 :(得分:0)
我认为你的问题仅仅是因为你使failOnTimeout ='false'。将其设为'真'
<collection-aggregator timeout="86400000" failOnTimeout="true" doc:name="Collection Aggregator">
它将等待文件(2或3个文件,根据您的要求),直到达到特定时间(此处为86400000)。一旦超过,它就会失败。
例如,在您的情况下(FailOnTime ='False')。如果您尝试发送一些4个文件。在这个时间内只收到2个文件。将处理不完整的文件(它不会等待剩余的2个文件)。
尝试检查您计划处理的文件数量,以及处理所需的时间(例如:4个文件),并相应地调整时间。