我一直在尝试将SftpInboundFileSynchronizer
与包含子目录的远程目录一起使用,例如/myfiles/mysubdir/lefile.txt,我设置了一个过滤器来抓取目录中的文件:
mysync.setRemoteDirectory("myfiles/");
mysync.setFilter(new SftpRegexPatternFileListFilter(".*\\.txt$"));
然后将SftpInboundFileSynchronizingMessageSource
作为我的InboundChannelAdapter
我在SftpInboundFileSynchronizingMessageSource
和RecursiveDirectoryScanner
上设置了扫描仪,但对深度或要检索的文件数量没有设置限制。我还为扫描仪设置了一个FOLLOW_LINKS
fileVisitOption,以确保效果良好。
我只能从myfiles路径将文件拉入本地目录,但更深的内容不会复制到本地目录。 我无法为自己的生活弄清楚是否有我在做的事情。
编辑: 如果我仅发送“ /”作为要使用mget -R检查的目录,InboundChannelAdapter将包含什么?
@Bean
@InboundChannelAdapter(value = "sftpChannel", poller = @Poller(fixedDelay = "10"))
public MessageSource<?> myMessageSource() {
}
@Bean(name = "myGateway")
@ServiceActivator(inputChannel = "sftpChannel")
public MessageHandler handler() {
SftpOutboundGateway gateway =
new SftpOutboundGateway(sftpSessionFactory(), "mget", "'myfiles/*'");
gateway.setOutputChannelName("listSplitter");
gateway.setOptions("-R");
gateway.setAutoCreateLocalDirectory(true);
myLocalPath = Paths.get(myLocalParentDir).toRealPath().toString();
gateway.setLocalDirectory(new File(myLocalPath));
SftpRegexPatternFileListFilter regexFilter = new regexFilter("^.*\\.txt");
regexFilter.setAlwaysAcceptDirectories(true);
regexFilter.setFilter(sftpRegexPatternFileListFilter);
return gateway;
}
答案 0 :(得分:0)
入站同步器不支持远程文件系统的递归;改为使用SftpOutboundGateway(请求/答复),并使用递归mget
命令。
默认情况下,不重新获取本地目录中存在的文件;您可以使用FileExistsMode
进行控制。