Spring integration 如何使用spring与spring batch的集成通过ftp将目录与子目录同步?

Spring integration 如何使用spring与spring batch的集成通过ftp将目录与子目录同步?,spring-integration,spring-batch,spring-integration-sftp,Spring Integration,Spring Batch,Spring Integration Sftp,我一直在尝试将SftpInboundFileSynchronizer用于包含子目录的远程目录,例如/myfiles/mysubdir/lefile.txt,我设置了一个过滤器来获取目录中的文件: mysync.setRemoteDirectory("myfiles/"); mysync.setFilter(new SftpRegexPatternFileListFilter(".*\\.txt$")); 然后是一个SftpInboundFileSynchronizingMessageSourc

我一直在尝试将
SftpInboundFileSynchronizer
用于包含子目录的远程目录,例如/myfiles/mysubdir/lefile.txt,我设置了一个过滤器来获取目录中的文件:

mysync.setRemoteDirectory("myfiles/");
mysync.setFilter(new SftpRegexPatternFileListFilter(".*\\.txt$"));
然后是一个
SftpInboundFileSynchronizingMessageSource
作为我的InboundChannelAdapter 我已将
SftpInboundFileSynchronizingMessageSource
a
RecursiveDirectoryScanner
设置为scanner,对要检索的文件的深度或数量没有设置限制。我还在扫描仪上设置了一个
FOLLOW\u LINKS
filevisitop,以便更好地测量

我只能从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;
}
@Bean
@InboundChannelAdapter(value=“sftpChannel”,poller=@poller(fixedDelay=“10”))
public MessageSource myMessageSource(){
}
@Bean(name=“myGateway”)
@ServiceActivator(inputChannel=“sftpChannel”)
public MessageHandler(){
SftpOutboundGateway网关=
新的SftpOutboundGateway(sftpSessionFactory(),“mget”,“myfiles/*”);
setOutputChannelName(“listSplitter”);
gateway.setOptions(“-R”);
gateway.setAutoCreateLocalDirectory(true);
myLocalPath=path.get(myLocalParentDir.toRealPath().toString();
setLocalDirectory(新文件(myLocalPath));
sftpregesterfilelistfilter regexFilter=新的regexFilter(“^.*\\.txt”);
regexFilter.setAlwaysAcceptDirectory(true);
regexFilter.setFilter(sftpregternfilelistfilter);
返回网关;
}

入站同步器不支持远程文件系统的递归;改为使用(请求/回复)和递归的
mget
命令


默认情况下,不会重新获取本地目录中存在的文件;您可以使用
FileExistsMode

控制这一点,我只能从myfiles路径将文件拉入本地目录,但任何更深的文件都不会复制到本地目录中:因此,如果我理解正确,您无法将远程目录递归复制到本地目录,对吗?如果是,则可能您的regexp不正确。该组件不支持远程目录上的递归;改用网关;有关详细信息,请参阅我的答案。@MahmoudBenHassine是的,但从Gary的评论来看,组件似乎不支持,因此将尝试使用gatewayOk,因为我需要定期检查目录结构,如果我理解正确,我需要一个进行mget的SFTPOUNTBOUNDGATHEWAY和一个正在轮询的入站适配器,该适配器将带有路径“/myfiles”的消息传递到网关?是的,只需一个简单的POJO(或lambda)入站通道适配器即可。我用一个片段更新了我的问题,希望我能得到一些帮助。使用lambda作为
消息源
-
()->“*”
。不过,10ms是一个相当快的民意测验工具。从文档中,我向您指出“模式被忽略,并且假定为
*
。默认情况下,将检索整个远程树。但是,您可以筛选树中的文件…”。如果您不使用
*
,您将得到一个警告日志。