【问题标题】:How to poll only the last modified file from folder using Apache Camel?如何使用 Apache Camel 仅轮询文件夹中最后修改的文件?
【发布时间】:2021-07-01 14:06:54
【问题描述】:

在基于 Spring 的应用程序中,我想使用 Camel 轮询文件夹并仅获取最近一次修改日期(最近的文件)的文件。文件夹中的文件不应该被骆驼删除。

我已尝试使用下一个选项开始路线:

from("file:C:/test?noop=true&sortBy=reverse:file:modified&eagerMaxMessagesPerPoll=false&maxMessagesPerPoll=1)
  .routeId("MainRoute")
  .bean(FileProcessor.class);
}

通过这样的配置,Camel 获取最近的文件,对其进行处理,然后开始处理下一个文件。

但在我的场景中,它应该只使用最后一个文件:如果没有添加任何文件,则每次都必须使用相同的文件。如果最近的文件将被删除,它必须找到另一个最近的文件。

如何在 Camel 中实现?

【问题讨论】:

  • 如果您的文件夹为空怎么办?它将如何找到最近的文件?
  • @BSangappa,假设文件夹不会为空

标签: java spring apache-camel spring-camel


【解决方案1】:

构建您自己的具有此逻辑的文件过滤器实现,您可以在其中保留每个文件夹的状态,这是您在那里接受的最后一个文件。然后过滤器可以返回 true 或 false 是否拾取文件。

在该逻辑中,您可以使用 Java 文件 API 列出所有文件以查找是否有另一个文件具有较新的时间戳等。

【讨论】:

  • 根据文档:“作为 org.apache.camel.component.file.GenericFileFilter 类的可插入过滤器。如果过滤器在其 accept() 方法中返回 false,将跳过文件。”所以它可以过滤目录中的文件。我怎样才能访问这个目录?只找到文件的父级?在这种情况下,我必须遍历所有文件,调用父级并执行检查。我认为它不会那么快。
【解决方案2】:

终于找到了一个简单的解决方案。根据文档:

如果 noop=true,Camel 也会设置 idempotent=true,以避免重复使用相同的文件。

因此,为了实现所需的行为,我们必须将idempotent 参数设置回false。通过这样的设置,Camel 不会从检查中排除任何文件:

from("file:C:/test?noop=true&idempotent=false&sortBy=reverse:file:modified&eagerMaxMessagesPerPoll=false&maxMessagesPerPoll=1)
  .routeId("MainRoute")
  .bean(FileProcessor.class);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    相关资源
    最近更新 更多