如何从多个文件中轮询最后修改的文件并发送到 apache camel 中的目标端点?

How to poll last modified file out of multiple files and send to target endpoint in apache camel?

这里我们有 4 个具有不同时间戳的文件。我们只需要选择最新的一个(使用 Apache camel 的第一个时间戳为 18/08/2016 的文件)。

如何实现?我找不到太多关于这个主题的资源。

似乎很容易在文件夹上使用 File::lastModified() 并循环到 File::listFiles():

public static void main(String[] args) {
    final String folder = "D:\Users\tmp";
    final File file = new File(folder);

    long lastModified = Long.MAX_VALUE; 
    for (File f : file.listFiles()) {
        if (f.lastModified() < lastModified) 
            lastModified = f.lastModified();
    }

    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
    System.out.println("Oldest is " + sdf.format(lastModified));
}

在我的 tmp 文件夹中:

data.csv     08/08/2016
data.json    28/07/2016
index.html   17/06/2016
map.csv      29/07/2016

输出:

Oldest is 06/17/2016 09:53:10

您可以使用Camel 中的过滤器实现Jordi Castilla 提供的方法。在这里查看文档: http://camel.apache.org/file2.html 请参阅有关使用过滤器的部分。

检查 Camel 的 File Language。看起来 file:modified 应该对你有帮助

您可以按时间戳对文件进行排序,然后告诉 Camel 只拾取 1 个文件。

sortBy=file:modified&eagerMaxMessagesPerPoll=false&maxMessagesPerPoll=1

您还需要关闭 eager max messages。有关这些选项的更多详细信息,请参阅 file2 文档:http://camel.apache.org/file2

如果您使用

从文件目录中消费
from("file:...")

然后您还需要考虑处理文件后如何处理文件,是否应该将其删除/保持原样(例如 noop)。例如,如果您删除了文件,那么 Camel 将在下一次轮询时选择最后修改的第二个文件,依此类推。

如果您需要删除所有文件,恐怕 Camel 没有开箱即用的功能,您可能需要自己编写一些逻辑来删除所有这些文件。