Spring ftp集成。处理后删除文件

时间:2016-10-17 16:57:31

标签: java spring ftp spring-integration

我需要每隔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仅提供仅在过去五分钟内在远程目录中创建的文件。看起来它首先下载文件,解析它们,删除然后在服务激活器完成其作业后立即再次下载这些相同的文件。 如何在服务完成解析后停止文件拉取。还是其他任何想法?

1 个答案:

答案 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毫秒后启动。