【问题标题】:Apache Camel File2 include only specific subfolders from the source directoryApache Camel File2 仅包含源目录中的特定子文件夹
【发布时间】:2019-01-31 06:02:49
【问题描述】:

我正在使用 Apache Camel File2 (SFTP)(带有 Camel 最新版本)和 Java8 API。 我正在尝试开发一个 MyRouteBuilder.java 类,它扩展了 RouteBuilder 类并实现了 configure 方法。

我想将文件从源路径传输到目标路径。 在源端点中,指定 URI 参数“include”以包含来自源路径下特定特定子文件夹的文件,例如“SubFolder1、SubFolder2、SubFolder3”。

示例源 URI: 1)“文件:\src\SubFolder1\.*\.txt” 2)“文件:\src\SubFolder2\.*\.txt”

我已经尝试过下面的多个示例,甚至 例子:

 1) include=.SubFolder[1-2]\.*\.txt
 2) include=.SubFolder1|SubFolder2\.*\.txt
 3) include=SubFolder[1-2]\.*\.txt
 4) include=SubFolder1\.*\.txt
 5) include=.SubFolder(?)\.*\.txt

没有任何效果。

请提出一种使用 Java 的 Apache Camel File2 API 解决方法。

public void configure() throws Exception {

    String sftpUrl = "sftp://" + user + "@" + hostName + sourcePath + "?" + "noop=true"
            + "&recursive=true&include=.*\\.txt$"+"&strictHostKeyChecking=no" + "&useUserKnownHostsFile=true" + "&password=RAW("
            + password + ")&preferredAuthentications=publickey,keyboard-interactive,password";  

    System.out.println("\n\n sftpUrl + " + sftpUrl + "\n\n");

    from(sftpUrl)
        .log(" Copying File : ${file:name} ").process(exchange -> {
        System.out.println("1. Processing a File  --> = " + exchange);
    }).to("file://" + destPath)
            // ;
    .log("Uploading file ${file:parent} / ${file:name} complete.");
}

【问题讨论】:

  • 假设您已经尝试过来自official docs 的示例。您能否向我们展示您的路线构建器代码(无论您拥有什么)。 “没有任何工作”不是一个好的问题陈述。告诉究竟是什么不起作用
  • 包含参数正则表达式不起作用
  • String sftpUrl = "sftp://" + user + "@" + hostName + sourcePath + "?" + "noop=true" + "&recursive=true&include=.SubFolder1\\\*\\.txt$"+"&strictHostKeyChecking=no" + "&useUserKnownHostsFile=true" + "&password=RAW(" + password + ")&preferredAuthentications= publickey,keyboard-interactive,password";
  • 这看起来像 ftp2 组件,而不是 File2。 FTP2 不支持include。请在 cmets 中的问题中发布您的整个路线。

标签: java apache-camel camel-ftp


【解决方案1】:

您应该使用antInclude,因为它同时支持目录和文件。 顺便说一句,Camel 网站正在进行全面重新设计,同时可以从 github 浏览最新的组件文档。

antInclude=F1/*.txt,F2/*.txt

那么看:https://github.com/apache/camel/blob/master/components/camel-ftp/src/main/docs/ftp-component.adoc

还请注意,您可以浏览每个版本的文档(选择分支/标签)。

【讨论】:

  • antInclude uri 选项在我尝试使用 sftp url 时工作正常。但是,当我尝试将以下 url 与“file://”而不是“sftp://”一起使用时,它不起作用。 file://C:/Input?noop=true&recursive=true&antInclude=F1/*.txt,F2/*.txt
  • 我的意思是当我使用带有“file://”的 url 时,camel 没有从子文件夹 F1 和 F2 传输文件
【解决方案2】:

正如下面@hk6279 所指出的,FTP2 继承了 File2 并且 File2 行为在 FTP2 上可用,除非另有说明。但是,@hk6279 强调了 OP 可能遗漏的一个非常重要的部分。

Only files (not directories) are matched for valid filename, if options such as: include or exclude are used.

可能这就是造成麻烦的原因。


看起来您指的是 FTP2 组件而不是 file2 组件。请查看FTP component's test cases 以了解过滤是如何实现的。 它不支持include 选项,您可以在docs 中看到。

【讨论】:

  • ftp2 docs 没有声称ftp2 组件不支持include 选项,但声明See File for more options as all the options from File is inherited 存在
  • 相反,您应该引用文件doc中的此声明Only files (not directories) are matched for valid filename, if options such as: include or exclude are used.
  • 也许这正是 OP 面临的问题。以后得试试这个看看。
  • 尝试使用antInclude 选项,因为它应该支持目录(它支持文件组件)
  • 示例:antInclude=F1/*.txt,F2/*.txt
猜你喜欢
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 2023-01-04
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多