Apache Camel如何用于监控文件更改?

时间:2013-11-20 03:04:01

标签: file apache-camel

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

uri喜欢:

file:/some/directory

将使用提供的目录中的文件,但会将其删除。

uri喜欢:

file:/some/directory?noop=true

在添加每个文件或路由启动时消耗每个文件。

令人惊讶的是,

没有一个选项
consumeOnChange=true

是否有直接的方法来监控文件更改而不是在使用后删除文件?

5 个答案:

答案 0 :(得分:17)

您可以通过设置idempotentKey来告诉Camel如何将文件视为已更改。例如,如果文件大小更改,或其时间戳更改等。

请参阅Camel文件文档:http://camel.apache.org/file2

请参阅避免多次读取同一文件(幂等消费者)部分。并阅读有关幂等和幂等关键的内容。

所以类似的东西

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

或者

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

您可以在此处阅读有关您可以使用的各种$ {file:xxx}令牌:http://camel.apache.org/file-language.html

答案 1 :(得分:1)

我不认为Camel支持该特定功能,但是现有选项可以提供类似的监视目录的解决方案。

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

也许您可以使用与Camel不同的其他解决方案,例如Apache Commons VFS2(我写了一个关于如何在这种情况下使用它的解释:WatchService locks some files?

答案 2 :(得分:0)

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

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");
        }
    };
}

我的测试步骤:

  1. 运行该程序,它将几个.log文件从D:/ Production复制到D:/ LogRepository,然后继续轮询D:/ Production目录
  2. 我打开了一个已经复制的日志,说来自D:/ Production的A.log(因为noop = true没有移动),并用一些编辑器工具编辑它。这使文件大小加倍并保存。
  3. 此时我认为Camel应该再次复制该特定文件,因为它的大小已被修改,并且在我的路由定义中我使用了“ idempotent = true& idempotentKey = $ {file:name} - $ {file:大小}&安培; readLock =改变”。但是骆驼忽略了这个文件。 当我使用TRACE进行记录时,它说“正在跳过文件......”,但是当我编辑并保存文件时,我在D:/ Production目录中找不到任何锁定文件。

    我还检查过,如果我从外面替换D:/ Production目录中的A.log(同名但大号),我仍然会忽略该文件。

    但我发现,如果我删除noop = true选项,一切都按预期工作。

    我错过了什么吗?

答案 3 :(得分:0)

noop 设置为 true 也会导致骆驼设置 idempotent = true ,尽管事实上幂等默认为 false

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

.from("file:path?noop=true&idempotent=false&delay=60s")

这将每隔一分钟监视给定目录中所有文件的更改。

这可以在骆驼的文档中找到:http://camel.apache.org/file2.html

答案 4 :(得分:0)

如果要监视骆驼中的文件更改,请使用文件监视组件。

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

from("file-watch://some-directory")
.log("File event: ${header.CamelFileEventType} occurred on file ${header.CamelFileName} at ${header.CamelFileLastModified}");

您可以在此处查看完整的文档: Camel file-watch component