Camel:在相同的camel上下文中的并行路由之间的同步

时间:2013-04-04 13:52:17

标签: apache-camel

我正在使用骆驼原型,它在同一个驼峰环境中使用两个起点。

第一条路线消耗用于"配置"应用程序。消息通过configService bean加载到配置库中:

    // read configuration files
    from("file:data/config?noop=true&include=.*.xml")
        .startupOrder(1)
        .to("bean:configService?method=loadConfiguration")
        .log("Configuration loaded");   

第二个路由实现了一个收件人列表eip模式,向许多收件人提供了不同类型的输入消息,这些收件人从同一个配置库中以语音方式读取:

    // process some source files (using configuration)       
    from("file:data/source?noop=true")
        .startupOrder(2)
        .unmarshal()
        .to("setupProcessor") // set "recipients" header
        .recipientList(header("recipients"))

    // ...

现在出现的问题是如何同步它们,所以第二条路线"等待"如果第一个是处理新数据。

我是Apache Camel的新手,并且对于如何处理这样的问题感到很遗憾,任何建议都会受到赞赏。

3 个答案:

答案 0 :(得分:3)

结合使用aggregate动态启动和停止路线的可能性:

from("file:data/config?noop=true&include=.*.xml")
    .id("route-config")
    .aggregate(constant(true), new MyAggregationStrategy()).completionSize(2).completionTimeout(2000)
    .process(new Processor() {
        @Override
        public void process(final Exchange exchange) throws Exception {
            exchange.getContext().startRoute("route-source");
        }
    });

from("file:data/source?noop=true&idempotent=false")
    .id("route-source")                              // the id is needed so that the route is found by the start and stop processors
    .autoStartup(false)                              // this route is only started at runtime
    .aggregate(constant(true), new MyAggregationStrategy()).completionSize(2).completionTimeout(2000)
    .setHeader("recipients", constant("direct:end")) // this would be done in a separate processor
    .recipientList(header("recipients"))
    .to("seda:shutdown");                            // shutdown asynchronously or the route would be waiting for pending exchanges

from("seda:shutdown")
    .process(new Processor() {
        @Override
        public void process(final Exchange exchange) throws Exception {
            exchange.getContext().stopRoute("route-source");
        }
    });

from("direct:end")
    .log("End");

这样,route-source仅在route-config完成时启动。如果在route-config目录中找到新文件,则会重新启动route-source并因此config

答案 1 :(得分:1)

您还可以在激活第二条路线的第一条路线中放置“完工”http://camel.apache.org/oncompletion.html

答案 2 :(得分:0)

Apache camel File将为正在处理的文件创建一个锁。如果存在锁定,则此文件上的任何其他文件进程都不会合并(除非您将consumer.exclusiveReadLock设置为false)

来源:

http://camel.apache.org/file.html => URI选项=> consumer.exclusiveReadLock