如何解决Spring 集成 - SftpPersistentAcceptOnceFileListFilter 过滤掉新文件/修改过的文件
我在我的 Sftp 出站网关上添加了 SftpPersistentAcceptOnceFileListFilter 来过滤掉我已经处理过的文件。
<int-sftp:outbound-gateway id="gateway"
expression="payload"
request-channel="request"
remote-directory="main"
command-options="-R"
command="ls"
session-factory="sessionFactory"
filter="sftpPersistentAcceptOnceFileListFilter"
reply-channel="reply">
</int-sftp:outbound-gateway>
<bean name="metadataStore" class="org.springframework.integration.metadata.PropertiesPersistingMetadataStore">
<property name="baseDirectory" value="/temp"/>
</bean>
<bean id="sftpPersistentAcceptOnceFileListFilter" class="org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter">
<constructor-arg name="store" ref="metadataStore"/>
<constructor-arg name="prefix" value="files/"/>
</bean>
例如我有这个目录:
main
--directoryA
--file1.txt
--file2.txt
--file3.txt
在第一次投票期间,一切似乎都正常。检查元数据存储,文件 1、文件 2、文件 3 存储在那里。下一次轮询,payload 返回空,因为所有文件都已经在存储中,并且它们都按预期被过滤器过滤掉了。但是,当我尝试加载另一个文件时,它以某种方式被过滤掉并且没有保存在元数据存储中。当我上传新版本的 file1.txt 时,也会发生同样的情况。我预计它会因为修改日期改变而通过过滤器,但不知何故它没有。我在这里错过了一些配置吗?
main
--directoryA
--file1.txt
--file2.txt
--file3.txt
**--file4.txt**
解决方法
我刚刚对其进行了测试,对我来说效果很好。
$ tree ~/main/
/.../main/
├── directoryA
│ ├── newOne
│ └── subdirectory1
│ └── bar
└── directoryB
└── subdirectory1
└── foo
4 directories,3 files
我在第二次投票后添加了 newOne:
GenericMessage [payload=[FileInfo [isDirectory=true,isLink=false,Size=96,ModifiedTime=Fri Feb 05 10:30:20 EST 2021,Filename=directoryA,RemoteDirectory=main/,Permissions=drwxr-xr-x],FileInfo [isDirectory=true,ModifiedTime=Mon Feb 01 10:09:57 EST 2021,Filename=directoryA/subdirectory1,FileInfo [isDirectory=false,Size=0,Filename=directoryA/subdirectory1/bar,Permissions=-rw-r--r--],ModifiedTime=Mon Feb 01 10:09:35 EST 2021,Filename=directoryB,ModifiedTime=Mon Feb 01 10:09:49 EST 2021,Filename=directoryB/subdirectory1,Filename=directoryB/subdirectory1/foo,Permissions=-rw-r--r--]],headers={file_remoteHostPort=localhost:22,id=94154291-1640-7e9c-25a4-707844517008,file_remoteDirectory=main/,timestamp=1612539050536}]
GenericMessage [payload=[],id=931d9c2d-6e09-7435-dc61-caa95f6659b5,timestamp=1612539060927}]
GenericMessage [payload=[FileInfo [isDirectory=true,Size=128,ModifiedTime=Fri Feb 05 10:31:06 EST 2021,Filename=directoryA/newOne,id=ebee7a69-c351-7ca7-010d-e90937d61dfa,timestamp=1612539071380}]
GenericMessage [payload=[],id=097dae97-16d6-b8c4-62bb-d5581a27824e,timestamp=1612539081806}]
然而,我确实注意到,我们只存储文件名,而不是子目录,所以如果您在多个地方有相同的文件名,它不会按预期工作。
我打开了一个 issue for that。
顺便说一下,您应该在生产环境中使用更强大的元数据存储(或至少在过滤器上使用 filter.setFlushOnUpdate(true);
;否则它们将不会保留,直到应用完全关闭)。
编辑
哦,但我发现这不是捡来的...
$ touch ~/main/directoryA/subdirectory1/andAnother
调查。
EDIT2
问题是我们正在过滤子目录;当我添加 newOne
时它起作用了,因为 directoryA
的时间戳改变了。当我添加 andAnother
时,subdir 时间戳改变了,但 directoryA
没有。
这里有一个解决方法:
SftpPersistentAcceptOnceFileListFilter filter = new SftpPersistentAcceptOnceFileListFilter(store,"foo") {
@Override
public boolean accept(LsEntry file) {
if (file.getAttrs().isDir()) {
return true;
}
else {
return super.accept(file);
}
}
};
GenericMessage [payload=[FileInfo [isDirectory=false,id=50faae38-5965-8655-102c-b263398e435b,timestamp=1612541209839}]
GenericMessage [payload=[],id=36cedd79-80e1-0c73-ba09-205528dccfca,timestamp=1612541220313}]
GenericMessage [payload=[],id=6a0826b4-f960-8b5b-a14e-1c205ca4f357,timestamp=1612541230803}]
GenericMessage [payload=[FileInfo [isDirectory=false,ModifiedTime=Fri Feb 05 11:07:11 EST 2021,Filename=directoryA/subdirectory1/andAnother,id=dcd9b6a4-5710-421c-1864-17b166d47a5a,timestamp=1612541241217}]
GenericMessage [payload=[],id=3eb67995-9ca1-6b8a-d9bd-02cd6d9ea894,timestamp=1612541251695}]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。