【问题标题】:Spring integration SFTP - dont redowload locally deleted filesSpring集成SFTP - 不要重新加载本地删除的文件
【发布时间】:2016-05-05 16:55:39
【问题描述】:

通过阅读 Spring SFTP 文档 (http://docs.spring.io/spring-integration/reference/html/sftp.html),尚不清楚是否可以防止重新下载成功传输的文件,这些文件随后会被删除。

正在传输的文件很大,由本地任务处理,然后可以删除。

但是,Spring SFTP 会发现它们已被删除(在运行时或重新启动时)并重新下载它们。

我已经在使用 SftpPersistentAcceptOnceFileListFilter 来避免重启。

上面的讨论是指在检索之前过滤文件 他们。一旦文件被检索到,一个额外的过滤器是 应用于文件系统上的文件。默认情况下,这是 anAcceptOnceFileListFilter,正如所讨论的,在 内存并且不考虑文件的修改时间。除非你的 应用程序在处理后删除文件,适配器将 应用程序重启后默认重新处理磁盘上的文件。

此外,如果您将过滤器配置为使用 FtpPersistentAcceptOnceFileListFilter,以及远程文件时间戳 更改(导致它被重新获取),默认的本地过滤器将 不允许处理这个新文件。

使用 local-filter 属性来配置本地的行为 文件系统过滤器。要解决这些特定用例,您可以使用 FileSystemPersistentAcceptOnceFileListFilter 作为本地过滤器 反而。此过滤器还存储接受的文件名和修改 MetadataStore 策略实例中的时间戳(第 9.5 节, “元数据存储”),并将检测本地文件中的更改 修改时间。

从这里,它提到本地文件被删除,我不知道我应该做什么。

这是我的相关配置:

<int-sftp:inbound-channel-adapter id="sftpInboundAdapter"
        auto-startup="true" channel="receiveChannel" session-factory="sftpSessionFactory"
        local-directory="file:local-dir" remote-directory="files"
        auto-create-local-directory="true" delete-remote-files="false"
        filter="compositeFilter">
        <int:poller fixed-rate="1000" max-messages-per-poll="1" />
    </int-sftp:inbound-channel-adapter>

<bean id="compositeFilter"
        class="org.springframework.integration.file.filters.CompositeFileListFilter">
        <constructor-arg>
            <list>
                <bean
                    class="org.springframework.integration.sftp.filters.SftpSimplePatternFileListFilter">
                    <constructor-arg value="*.zip" />
                </bean>
                <bean
                    class="org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter">
                    <constructor-arg name="store" ref="metadataStore" />
                    <constructor-arg value="foo/bar" />
                </bean>
            </list>
        </constructor-arg>
    </bean>

【问题讨论】:

    标签: java spring spring-integration spring-integration-sftp


    【解决方案1】:

    请使用您的配置编辑您的问题 - SftpPersistentAcceptOnceFileListFilter 应该会阻止重新下载文件,除非文件上的时间戳发生更改。

    F[] files = session.list(remoteDirectory);
    if (!ObjectUtils.isEmpty(files)) {
        List<F> filteredFiles = filterFiles(files);
        for (F file : filteredFiles) {
            try {
                if (file != null) {
                    copyFileToLocalDirectory(
                            remoteDirectory, file, localDirectory,
                            session);
                }
            }
    ...
    

    【讨论】:

    • Gary,这是远程站点上的时间戳吗?
    • 是的;远程和本地过滤器是独立的 - 如果持久(远程)filter 检测到尚未下载的文件,或者远程服务器上的时间戳已更改,则下载该文件,否则跳过该文件。如果您将 Redis 用于元数据存储,则可以使用 redis-climonitor 实时观看更新。
    • 说得有道理,加里。我已经用配置更新了我的问题 - 并仔细检查了文件在本地删除后是否仍在重新下载。
    • 您是否查看过元数据存储中的数据?打开 DEBUG 日志记录,如果您仍然无法弄清楚,请将日志发布到某个地方,例如 github gist 或 pastebin 等(它可能对于堆栈溢出来说太大了)。
    • 商店是空的,我不确定为什么 - 它在 /tmp/ 并且是可写的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多