我正在查看我们在申请中遇到的一些问题。 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>
答案 0 :(得分:0)
正如我在您的问题的评论中推测的那样,(默认)AcceptOnceFileListFilter
无法很好地扩展到大量文件,因为它对先前处理的文件执行线性搜索。
我们可以在那里做一些改进;我打开了JIRA Issue for that。
但是,如果您不需要该过滤器的语义(即您的流程在完成时删除了输入文件),您可以将其替换为另一个过滤器,例如AcceptAllFileListFilter
。
如果您需要接受一次语义,则需要更高效的实现此类大量文件。但我会警告说,当使用如此大量的文件时,如果你在处理后没有删除它们,无论过滤器如何,事情都会变慢。