如何使用Spring Batch和Spring Batch将目录与子目录通过ftp同步?

时间:2018-11-29 22:59:58

标签: spring-integration spring-batch spring-integration-sftp

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

mysync.setRemoteDirectory("myfiles/");
mysync.setFilter(new SftpRegexPatternFileListFilter(".*\\.txt$"));

然后将SftpInboundFileSynchronizingMessageSource作为我的InboundChannelAdapter 我在SftpInboundFileSynchronizingMessageSourceRecursiveDirectoryScanner上设置了扫描仪,但对深度或要检索的文件数量没有设置限制。我还为扫描仪设置了一个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;
}

1 个答案:

答案 0 :(得分:0)

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

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