我们使用spring integration sftp入站通道适配器,每隔几秒轮询一次,并将zip文件下载到本地目录进行进一步处理 . 当有一个大文件,其中客户端仍在上载该文件时,问题就会启动,并且此入站适配器会选择该不完整的文件 . 我们使用AcceptAllFileFilter进行远程过滤,对于本地我们使用自定义过滤器 .
是否有更好的方法可以忽略或检查文件是否已完全上传,然后选择进行处理?
这是(s)ftp - 获取部分文件的典型问题 .
有两种常见的解决方案......
使用其他名称编写文件,然后重命名 .
添加特殊文件(例如 foo.zip 完成时为 foo.done ) .
foo.zip
foo.done
Spring Integration(在写入方面)使用1)(用 foo.zip.writing 写入文件并重命名为 foo.zip ) . 这是最简单的机制,因为它很容易过滤 .writing 文件 - Spring Integration会自动执行此操作 .
foo.zip.writing
.writing
2)有点困难,因为如果 foo.done 不存在,你需要编写一个自定义 FileListFilter 来忽略 foo.zip .
FileListFilter
底层(S)FTP协议无法在不使用这些机制的情况下阻止获取部分文件 .
EDIT :
如果您无法控制发件人,则可以编写自定义 filter ( FileListFilter ),该文件只会在一段时间内未更改时才会获取文件 .
filter
这是一个Spring Integration问题,对于使用(S)FTP的任何应用程序来说,这是一个必须解决的问题 . Spring Integration提供了一个解决方案,以及根据您的情况解决它的所有钩子 .
1 回答
这是(s)ftp - 获取部分文件的典型问题 .
有两种常见的解决方案......
使用其他名称编写文件,然后重命名 .
添加特殊文件(例如
foo.zip
完成时为foo.done
) .Spring Integration(在写入方面)使用1)(用
foo.zip.writing
写入文件并重命名为foo.zip
) . 这是最简单的机制,因为它很容易过滤.writing
文件 - Spring Integration会自动执行此操作 .2)有点困难,因为如果
foo.done
不存在,你需要编写一个自定义FileListFilter
来忽略foo.zip
.底层(S)FTP协议无法在不使用这些机制的情况下阻止获取部分文件 .
EDIT :
如果您无法控制发件人,则可以编写自定义
filter
(FileListFilter
),该文件只会在一段时间内未更改时才会获取文件 .这是一个Spring Integration问题,对于使用(S)FTP的任何应用程序来说,这是一个必须解决的问题 . Spring Integration提供了一个解决方案,以及根据您的情况解决它的所有钩子 .