File 如何使用Apache Camel监视文件更改?

File 如何使用Apache Camel监视文件更改?,file,apache-camel,File,Apache Camel,我想监控给定目录中的所有文件的更改,即更新的时间戳。这个用例对于使用文件组件的Camel来说似乎很自然,但我似乎找不到一种方法来配置这种行为 uri类似于: file:/some/directory file:/some/directory?noop=true 将使用提供的目录中的文件,但将删除它们 uri类似于: file:/some/directory file:/some/directory?noop=true 在添加或启动路由时使用每个文件一次 令人惊讶的是,在这方面没有一个选择

我想监控给定目录中的所有文件的更改,即更新的时间戳。这个用例对于使用文件组件的Camel来说似乎很自然,但我似乎找不到一种方法来配置这种行为

uri类似于:

file:/some/directory
file:/some/directory?noop=true
将使用提供的目录中的文件,但将删除它们

uri类似于:

file:/some/directory
file:/some/directory?noop=true
在添加或启动路由时使用每个文件一次

令人惊讶的是,在这方面没有一个选择

consumeOnChange=true

有没有一种简单的方法可以监视文件更改,并且在使用后不删除文件?

我认为Camel不支持该特定功能,但通过现有的选项,您可以提出一种类似的监视目录的解决方案

您需要做的是设置一个小的延迟值来检查目录并维护已读文件的存储库。根据您配置存储库的方式(按大小、文件名、它们的组合…),此解决方案将能够为您提供有关新闻文件和修改文件的信息。作为一个警告,它将非常频繁地使用目录中的文件


也许您可以使用其他不同于Camel的解决方案,比如Apache Commons VFS2(我写了一篇关于如何在这个场景中使用它的解释:

您可以通过设置幂等键来告诉Camel文件是如何更改的。例如,如果文件大小更改,或其时间戳更改等

有关更多详细信息,请参阅驼峰文件文档,网址为:

请参阅“避免多次读取同一文件”(幂等使用者)一节,并阅读有关幂等和幂等键的内容

有点像

from("file:/somedir?noop=true&idempotentKey=${file:name}-${file:size}")


您可以在这里阅读有关您可以使用的各种${file:xxx}令牌的信息:

我遇到了同样的问题,即希望复制更新的文件(以及新文件)。下面是我的配置

public static void main(String[] a) throws Exception {

    CamelContext cc = new DefaultCamelContext();

    cc.addRoutes(createRouteBuilder());

    cc.start();

    Thread.sleep(10 * 60 * 1000);

    cc.stop();
}


protected static RouteBuilder createRouteBuilder() {
    return new RouteBuilder() {
        public void configure() {
            from("file://D:/Production"
                    + "?idempotent=true"
                    + "&idempotentKey=${file:name}-${file:size}"
                    + "&include=.*.log"
                    + "&noop=true"
                    + "&readLock=changed")

            .to("file://D:/LogRepository");
        }
    };
}
我的测试步骤:

  • 运行该程序,它会将几个.log文件从D:/Production复制到D:/LogRepository,然后继续轮询D:/Production目录
  • 我打开了一个已经复制的日志,比如D:/Production中的a.log(因为noop=true,未移动任何内容),并使用一些编辑器工具对其进行编辑。这使文件大小增加了一倍并保存了它
  • 此时,我认为Camel应该再次复制该特定文件,因为它的大小被修改了,并且在我的路由定义中使用了“idempotent=true&idempotentKey=${file:name}-${file:size}&readLock=changed”。但是Camel忽略了该文件。 当我使用TRACE进行日志记录时,它会显示“跳过,因为文件已在进行中…”,但在编辑和保存文件时,我在D:/Production目录中未找到任何锁定文件

    我还检查了如果我从外部替换D:/Production目录中的A.log(名称相同但大小更大),camel仍然会忽略该文件

    但我发现,如果我删除noop=true选项,一切都正常工作

    我遗漏了什么吗?

    将noop设置为true也会导致Camel设置幂等元=true,尽管默认情况下幂等元是false

    监视文件的最简单解决方案是:

    .from("file:path?noop=true&idempotent=false&delay=60s")
    
    这将每隔一分钟监视给定目录中所有文件的更改


    这可以在Camel文档中找到:。

    如果要在Camel中监视文件更改,请使用文件监视组件

    示例->递归监视所有事件(文件创建、文件删除、文件修改):

    您可以在此处查看完整的文档:

    感谢您抽出时间回复,克劳斯。我非常感谢您在Camel上的工作。我在下次会议之前尝试了20分钟,但似乎无法正常工作。我尝试了大小并修改了大小,但没有任何效果。我现在了解到noop默认情况下变为幂等真,这是有意义的。我将在下次开会时继续查看文件标记还有一点时间,但我希望在添加${file:name}-${file:modified}时,它会开始拾取修改过的文件。还有其他问题吗?再次感谢!啊,我刚刚记得我最近用幂等键修复了一个bug,尽管是针对FTP报告的。它的CAMEL-6936。因此将在即将发布的版本中修复。对于这个bug,我感到抱歉。不用担心-所以像你发布的第二个url应该可以在将来的版本中使用?快照工件是否发布在任何地方?嗯-我尝试了la测试2.12.2-SNAPSHOT和2.13-SNAPSHOT。运气不好。要清楚,我的url现在看起来像“?noop=true&idempotentKey=${file:name}-${file:modified}”也许它还没有出现在版本中?啊,感谢CAMEL-6936的第一个修复程序没有涵盖所有内容。我已经再次修复了这个问题。因此,将来的快照更新都应该包括该修复程序。您是否尝试过将此作为单独的问题发布?当从关注的文件夹中删除文件而不是修改文件时,是否有任何标志触发路由?说得好。这是务实的回答:-)在我的例子中(一个驼峰FTP客户端在文件可用时立即发送文件),我添加了一个JMS队列,文件生产者在其中发布一条消息来唤醒FTP客户端。