我正在使用骆驼原型,它在同一个驼峰环境中使用两个起点。
第一条路线消耗用于"配置"应用程序。消息通过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的新手,并且对于如何处理这样的问题感到很遗憾,任何建议都会受到赞赏。
答案 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