【问题标题】:How to select subfolder using File component of Apache Camel?如何使用 Apache Camel 的文件组件选择子文件夹?
【发布时间】:2021-07-13 10:10:02
【问题描述】:

我有基于 Spring Boot 的 Camel 应用程序,有一个定义的路由应该轮询特定文件夹(例如C:/test)。在此文件夹中,有按当天序号日期命名的子文件夹:196、197、198 等。我需要过滤这些子文件夹并选择名称中具有最大值的文件夹。换句话说,我需要动态选择 File 组件的文件夹,例如C:/test/197.

我尝试使用参数filterDirectory,例如将其设置为"${date:now:yyyy}"。我尝试了文件夹结构的其他配置,在我看来这个参数不起作用。

这样的子文件夹选择可以用 Camel 实现吗?

更新: 目前没有机会从代码中扫描根文件夹中的子文件夹,因此解决方案应仅依赖 Camel 框架。

【问题讨论】:

    标签: java spring apache-camel spring-camel


    【解决方案1】:

    如果过滤文件或文件夹的可配置选项不适用于您的情况,您可以实现 GenericFileFilter 类并将其配置为 filter 选项。

    GenericFileFilter 类仅包含一个 accept 方法,该方法返回 true(文件被导入)或 false(文件被忽略)。

    请注意,如果要处理子目录及其文件,则需要配置recursive=true。如果没有递归选项,Camel 默认会忽略所有子目录。

    如果您激活recursive 选项,则会为文件和文件夹调用GenericFileFilter 的accept 方法。不要忘记处理文件夹。如果您为某个目录返回 false,则该目录中的所有文件都将被忽略。

    所以对于您的情况(从某个子文件夹导入所有文件)我看到类似这样的内容

    @Override
    public boolean accept(GenericFile file) {
        correctSubfolder = ... calculate name
    
        if (file.isDirectory() && file.getFileName().equals(correctSubfolder)) {
            // walk into the correct subdirectory
            return true;
        }
    
        if (!file.isDirectory() && file.getParent().equals(correctSubfolder)) {
            // only process files of the correct subdirectory
            return true;
        }
    
        // ignore everything else
        return false;
    

    【讨论】:

    • 是的,我知道这个功能,但这仅适用于所选父目录中的文件。如果我定义GenericFileFilter,它将只轮询父目录中的文件,而不考虑子文件夹。问题是如何使用 File 组件动态选择子文件夹。
    • 我刚刚扩展了我的答案。 FileFilter 处理文件和文件夹。但是,如果您为文件夹返回 false,则它不会“访问”其中的文件。
    • 我用下一个配置重新检查了这个:我的文件夹 C:/test/2021 只有 3 个子文件夹(包含一些文件),其中没有文件。该路由具有下一个端点:file:C:/test/2021?noop=true&filter=#fileFilter,FileFilter 注册为@Component,并在应用启动时启动。我在FileFilter 中放置了一些断点,但应用程序无法访问它们。如果我将文件放在根目录中,应用程序启动会轮询该文件。所以我可以说GenericFileFilter 的bean 在我的情况下看不到目录。
    • 当您还配置recursive=true时,子目录是否可能仅到达FileFilter?我不记得 recursive 选项是否是子目录的“主开关”,或者 FileFilter 是否独立于其他选项
    • 我刚刚检查并验证了这一点。您必须激活 recursive=true 才能在 FileFilter 中获取子文件夹及其文件。
    猜你喜欢
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2016-01-12
    相关资源
    最近更新 更多