我需要每隔5分钟通过ftp将文件下载到本地目录,处理每个文件然后从本地目录中删除。 我有弹簧ftp入站适配器的以下配置
<int-ftp:inbound-channel-adapter
id="ftpPortAdapter"
channel="receiveChannel"
session-factory="ftpSessionFactory"
local-directory="/test"
local-filename-generator-expression="#this"
remote-directory="/prod"
auto-create-local-directory="true"
delete-remote-files="false"
filter="compositeFilter">
<int:poller fixed-delay="300000" max-messages-per-poll="-1"/>
</int-ftp:inbound-channel-adapter>
<bean id="compositeFilter" class="org.springframework.integration.file.filters.CompositeFileListFilter">
<constructor-arg>
<list>
<bean class="org.springframework.integration.file.filters.AcceptOnceFileListFilter"/>
<bean id="customFilter"
class="ru.lanit.parkomats.integration.impl.dozor.MyInboundChannelFilter">
<property name="initDate" value="2016-10-12 00:00:00"/>
</bean>
</list>
</constructor-arg>
</bean>
<int:channel id="receiveChannel">
</int:channel>
<int:service-activator input-channel="receiveChannel" ref="ftpFileService" method="processNewFiles">
<int:request-handler-advice-chain>
<bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
<property name="onSuccessExpression" value="payload.delete()"/>
<property name="onFailureExpression" value="payload.delete()"/>
</bean>
</int:request-handler-advice-chain>
</int:service-activator>
CustomFilter仅提供仅在过去五分钟内在远程目录中创建的文件。看起来它首先下载文件,解析它们,删除然后在服务激活器完成其作业后立即再次下载这些相同的文件。 如何在服务完成解析后停止文件拉取。还是其他任何想法?
答案 0 :(得分:1)
尝试使用FtpPersistentAcceptOnceFileListFilter
代替AcceptOnceFileListFilter
。
由于FTPFile
未实现equals()
和hashCode()
,if (this.seenSet.contains(file)) {
操作失败,我们将该文件视为新文件并继续。
由于您使用again immediately
,因此不确定fixed-delay="300000"
。
FtpInboundFileSynchronizer
将所有匹配的文件下载到本地目录。只有在那之后,FtpInboundFileSynchronizingMessageSource
才开始将它们作为消息发出。由于您使用max-messages-per-poll="-1"
,因此将在一个轮询周期内发送所有本地文件。
新轮询仅在300000
毫秒后启动。