文件轮询器在队列已满或经过一定时间后激活
File poller activated either when a queue is full or a set amount of time passes
我们被要求为文件夹中的报告文件编制索引。我们需要分批索引,这意味着如果我们没有足够的文件,我们将不会索引。但是,即使经过一定时间后我们没有足够的文件,我们最终也会建立索引。所以我们有这两个条件触发相同的功能。
我们已经能够正确配置队列、入站轮询器(用于获取文件)和出站轮询器(用于在 x 时间后索引文件)。但是,当队列已满时,我们仍然无法触发该功能。而且,尽管我承认我们远不是 Spring 集成方面的专家,但请相信我,当我说我们已经多次阅读文档并看到无穷无尽的示例项目时。但这仍然超出了我们的范围。
说够了。在这里,有一些代码:
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());
}
}
您使用了错误的方法。
不要为此使用队列 - 只需编写自定义 FileListFilter
并将其注入文件适配器 - 过滤器可以 return 一个空列表,直到所需的时间过去或所需的已达到文件数量。
我们被要求为文件夹中的报告文件编制索引。我们需要分批索引,这意味着如果我们没有足够的文件,我们将不会索引。但是,即使经过一定时间后我们没有足够的文件,我们最终也会建立索引。所以我们有这两个条件触发相同的功能。
我们已经能够正确配置队列、入站轮询器(用于获取文件)和出站轮询器(用于在 x 时间后索引文件)。但是,当队列已满时,我们仍然无法触发该功能。而且,尽管我承认我们远不是 Spring 集成方面的专家,但请相信我,当我说我们已经多次阅读文档并看到无穷无尽的示例项目时。但这仍然超出了我们的范围。
说够了。在这里,有一些代码:
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());
}
}
您使用了错误的方法。
不要为此使用队列 - 只需编写自定义 FileListFilter
并将其注入文件适配器 - 过滤器可以 return 一个空列表,直到所需的时间过去或所需的已达到文件数量。