文件轮询器在队列已满或经过设定的时间量时激活

时间:2016-07-21 07:41:16

标签: queue spring-integration poller

我们已被要求索引文件夹中的报告文件。我们需要批量索引,这意味着如果我们没有足够的文件,我们就不会索引。但是,即使在经过一定时间后我们没有足够的文件,我们也会最终编制索引。所以我们有两个触发相同功能的条件。

我们已经能够正确配置队列,入站轮询器(用于获取文件)和出站轮询器(用于在x时间过后索引文件)。但是,当队列已满时,我们仍然无法触发该功能。而且,尽管我认识到我们远不是Spring Integration的专家,但是当我说我们多次浏览文档并看到无数的示例项目时,请相信我。但这仍然无法实现我们的目标。

足够的话。在这里,有一些代码:

IP的客户的报告-配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:int="http://www.springframework.org/schema/integration"
       xmlns:int-file="http://www.springframework.org/schema/integration/file"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                  http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
                  http://www.springframework.org/schema/integration/file http://www.springframework.org/schema/integration/file/spring-integration-file.xsd">

    <bean id="customerReportsFileManager" class="xxx.xxx.xxx.xxx.reports.CustomerReportsFileManager" />

    <int:channel id="customerReportInputChannel" />

    <int-file:inbound-channel-adapter channel="customerReportInputChannel" directory="${customer.reports.directory}">
        <int:poller time-unit="SECONDS" fixed-delay="3" />
    </int-file:inbound-channel-adapter>

    <int:service-activator input-channel="customerReportInputChannel" output-channel="customerReportIndexationInputChannel"
                           ref="customerReportsFileManager" method="prepareFile" />

    <int:channel id="customerReportIndexationInputChannel">
        <int:queue capacity="3" /> <!-- Capacity -1 -->
    </int:channel>

    <int:outbound-channel-adapter channel="customerReportIndexationInputChannel" ref="customerReportsFileManager" method="indexReports">
        <int:poller time-unit="SECONDS" fixed-delay="60" />
    </int:outbound-channel-adapter>

</beans>

CustomerReportsFileManager:

public class CustomerReportsFileManager {
    private static final Logger LOGGER = LoggerFactory.getLogger(CustomerReportsFileManager.class);

    public File prepareFile(File file) {
        LOGGER.warn("[prepareFile] " + file.getPath());

        return file;
    }

    public void indexReports(File file) {
        LOGGER.warn("[indexReports] " + file.getPath());
    }
}

1 个答案:

答案 0 :(得分:2)

您使用的是错误的方法。

不要为此使用队列 - 只需编写自定义FileListFilter并将其注入文件适配器 - 过滤器可以返回空列表,直到所需的时间过去或达到所需的文件数。