Spring Integration和进程花费时间和暂停的问题

时间:2014-12-02 10:41:01

标签: java spring spring-integration

我正在查看我们在申请中遇到的一些问题。 Spring集成用于轮询特定目录,然后处理此目录中的文件。它可以处理5k 1kb文件,有时会出现一个巨大的停顿,即应用程序无所事事只是闲置,然后在4分钟内完成整个过程。然后下一次运行将花费更长的时间,之后的运行需要稍长一些,依此类推,直到我重新启动应用程序,然后返回到4分钟标记。之前有没有人遇到过这个问题。

我写了一个没有Spring Integration的独立版本,并没有遇到同样的问题。 我还在下面粘贴了xml配置,只是因为我做错了一些我无法发现的事情。

提前致谢。

 <!-- Poll the input file directory for new files.  If found, send a Java File object on inputFileChannel -->
    <file:inbound-channel-adapter directory="file:${filepath}"
        channel="inputFileChannel" filename-regex=".+-OK.xml">
        <si:poller fixed-rate="5000" max-messages-per-poll="1" />
    </file:inbound-channel-adapter>

    <si:channel id="inputFileChannel" />

    <!-- Call processFile() and start parsing the XML inside the File -->
    <si:service-activator input-channel="inputFileChannel"
                          method="splitFile" ref="splitFileService">
    </si:service-activator>

    <!-- Poll the input file directory for new files.  If found, send a Java File object on inputFileChannel -->
    <file:inbound-channel-adapter directory="file:${direcotrypath}" channel="inputFileRecordChannel" filename-regex=".+-OK.xml">

 <si:poller fixed-rate="5000" max-messages-per-poll="250" task-executor="executor" />
    </file:inbound-channel-adapter>

    <task:executor id="executor" pool-size="8"
                   queue-capacity="0"
                   rejection-policy="DISCARD"/>

    <si:channel id="inputFileRecordChannel" />

    <!-- Call processFile() and start parsing the XML inside the File -->
    <si:service-activator input-channel="inputFileRecordChannel"
                          method="processFile" ref="processedFileService">
    </si:service-activator>

    <si:channel id="wsRequestsChannel"/>

    <!-- Sends messages from wsRequestsChannel to the httpSender, and returns the responses on
         wsResponsesChannel.  This is used once for each record found in the input file. -->
    <int-ws:outbound-gateway uri="#{'http://localhost:'+interfaceService.getWebServiceInternalInterface().getIpPort()+'/ws'}"
        message-sender="httpSender"
        request-channel="wsRequestsChannel" reply-channel="wsResponsesChannel" mapped-request-headers="soap-header"/>

    <!-- Handles the responses from the web service (wsResponsesChannel).  Again
         this is used once for each response from the web service -->
    <si:service-activator input-channel="wsResponsesChannel"
        method="handleResponse" ref="responseProcessedFileService">
    </si:service-activator>

1 个答案:

答案 0 :(得分:0)

正如我在您的问题的评论中推测的那样,(默认)AcceptOnceFileListFilter无法很好地扩展到大量文件,因为它对先前处理的文件执行线性搜索。

我们可以在那里做一些改进;我打开了JIRA Issue for that

但是,如果您不需要该过滤器的语义(即您的流程在完成时删除了输入文件),您可以将其替换为另一个过滤器,例如AcceptAllFileListFilter

如果您需要接受一次语义,则需要更高效的实现此类大量文件。但我会警告说,当使用如此大量的文件时,如果你在处理后没有删除它们,无论过滤器如何,事情都会变慢。