Mule ESB集合 - 聚合器处理问题

时间:2015-07-14 17:50:29

标签: mule

我想要完成的流程的简化版本是我将拥有应该按顺序处理的文件集,并且仅作为完整集。为了概念验证,我创建了一个流程来收集一组名为" 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;集已经处理完毕。有人能告诉我如何让它等待不完整的设置而不是继续其他设置吗?我有正确的处理顺序,只是没有等待丢失文件的能力,并且如果有不完整的集合,则保持序列顺序。

1 个答案:

答案 0 :(得分:0)

我认为你的问题仅仅是因为你使failOnTimeout ='false'。将其设为'真'

    <collection-aggregator timeout="86400000" failOnTimeout="true" doc:name="Collection Aggregator">

它将等待文件(2或3个文件,根据您的要求),直到达到特定时间(此处为86400000)。一旦超过,它就会失败。

例如,

在您的情况下(FailOnTime ='False')。如果您尝试发送一些4个文件。在这个时间内只收到2个文件。将处理不完整的文件(它不会等待剩余的2个文件)。

尝试检查您计划处理的文件数量,以及处理所需的时间(例如:4个文件),并相应地调整时间。