Spring与ftp跳过文件集成

时间:2015-06-24 07:20:57

标签: java spring ftp spring-integration

我正在使用spring集成来连接和下载ftp中的文件。 我有两个过滤器,一个是文件名,另一个是只使用redis接受一个文件。 在大多数情况下,它工作得很好但是我注意到两个问题:

  1. 有些文件被跳过,而且根本没有下载
  2. 有些文件开始写入,但在完成之前停止并留下.writing临时文件扩展名 - 我怀疑它在我重启服务或与ftp服务器的连接丢失时发生。
  3. 下面是我对sftp连接的配置,但我还有两个使用ftp的供应商和其他有相同问题的ftps。

    <bean id="eeSftpClientFactory" class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
        <property name="host" value="ftp.host.com"/>
        <property name="port" value="22"/>
        <property name="user" value="myUserName"/>
        <property name="password" value="myPassword"/>
    </bean>
    
    <bean id="eeFilesFilter" class="org.springframework.integration.file.filters.CompositeFileListFilter">
        <constructor-arg>
            <list>
                <bean class="org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter">
                    <constructor-arg ref="redisMetadataStore"/>
                    <constructor-arg value=""/>
                </bean>
                <bean class="org.springframework.integration.sftp.filters.SftpSimplePatternFileListFilter">
                    <constructor-arg value="*.nm4"/>
                </bean>
            </list>
        </constructor-arg>
    </bean>
    
    <int-sftp:inbound-channel-adapter id="eeChannelAdapter"
                                     channel="eeFtpChannel"
                                     session-factory="eeSftpClientFactory"
                                     auto-startup="${ais.feeds.ee.enabled}"
                                     auto-create-local-directory="true"
                                     delete-remote-files="false"
                                     remote-directory="/SAISData/"
                                      filter="eeFilesFilter"
                                     local-directory="${ais.feeds.base.path}/eeVendor">
        <int:poller fixed-delay="500" max-messages-per-poll="-1"/>
    </int-sftp:inbound-channel-adapter>
    
    <int:channel id="eeFtpChannel">
        <int:queue capacity="500"/>
    </int:channel>
    
    <int:service-activator id="eeFeedHandlerActivator"
                           input-channel="eeFtpChannel"
                           ref="eeFeedHandler"
                           method="execute">
        <int:poller fixed-delay="500" max-messages-per-poll="-1"/>
    </int:service-activator>
    

    你的建议很受欢迎!

1 个答案:

答案 0 :(得分:0)

找到问题#2的原因 - SftpPersistentAcceptOnceFileListFilter检查文件是否已经处理并将其添加到元数据存储 - 如果由于重新启动而中间停止进程,则文件不会从元数据存储回滚,因此在重新启动文件已经存在于元数据中后再次检查存储,因此不会重新下载。