【问题标题】:how can i synchronize a directory with subdirectories over ftp using spring integration with spring batch?如何使用 spring 与 spring 批处理集成通过 ftp 将目录与子目录同步?
【发布时间】:2018-11-29 22:59:58
【问题描述】:

我一直在尝试将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;
}

【问题讨论】:

  • I am only able to pull files into the local directory from the myfiles path, but anything deeper is not copied to the local dir: 所以如果我理解正确你不能递归地将远程目录复制到本地目录,对吗?如果是,那么您的正则表达式可能不正确。
  • 该组件不支持对远程目录的递归;改用网关;详情见我的回答。
  • @MahmoudBenHassine 是的,但从 Gary 的 cmets 看来,该组件不支持,因此将尝试使用网关

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


【解决方案1】:

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

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

【讨论】:

  • 好的,考虑到我需要定期检查目录结构,如果我理解正确,我将需要一个执行 mget 的 SftpOutboundGateway 和某个被轮询的入站适配器,该适配器通过路径“/myfiles”传递消息“到网关?
  • 是的,只需一个简单的 POJO(或 lambda)入站通道适配器即可满足要求。
  • 我用 sn-p 更新了我的问题,希望我能得到一些帮助。
  • MessageSource - () -&gt; "*" 使用 lambda。不过,10ms 是一个相当快的轮询器。从文档中我指出“模式被忽略并假定*。默认情况下,检索整个远程树。但是,您可以过滤树中的文件......”。如果您不使用*,您将收到警告日志。
猜你喜欢
  • 2010-11-30
  • 2012-11-30
  • 1970-01-01
  • 2015-11-24
  • 2013-04-30
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多