Apache camel ApacheCamel:同一条路由的多条路由
我希望将消息从多个路由路由到同一路由,但它的工作方式与我假设的不同。我设置了以下内容(我只是记下要点): 我也测试了它,但在我的情况下,它没有产生任何成果 EDIT2: 我在此添加如何使用聚合器,即本例中的路由“c”:Apache camel ApacheCamel:同一条路由的多条路由,apache-camel,Apache Camel,我希望将消息从多个路由路由到同一路由,但它的工作方式与我假设的不同。我设置了以下内容(我只是记下要点): 我也测试了它,但在我的情况下,它没有产生任何成果 EDIT2: 我在此添加如何使用聚合器,即本例中的路由“c”: from("vm:AGGREGATOR").routeId("AGGREGATOR") .aggregate( constant("AGG"), new RecordAggregator()) .completionTimeout(AGGREGAT
from("vm:AGGREGATOR").routeId("AGGREGATOR")
.aggregate( constant("AGG"), new RecordAggregator())
.completionTimeout(AGGREGATOR_TIMEOUT)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
LOGGER.info("### Process AGGREGATOR");
[...]
}
})
.marshal().csv()//.tracing()
.to("file:extract?fileName=${in.header.AGG}.csv")
.end();
在日志中,字符串“####进程聚合器”只出现一次。我只是想知道它是否不能依赖于我正在使用的.completionTimeout(聚合器超时)。在我看来,应该在这段时间内为标头中的每个不同AGG值创建一个文件。这种理解正确吗?我认为使用异步组件,如seda、vm、activemq可能会解决您的问题 这种行为direct组件因为direct是同步组件,这也可能与在第三条路由中使用聚合器有关 例如:
from("direct:a") [...]
.to("seda:c");
from("direct:b") [...]
.to("seda:c");
from(seda:c) <your aggregator functionality comes here>
.to("direct:someOtherRoute");
而且,可能
completionTimeout
太低了…我认为使用异步组件,例如seda,vm,activemq可能会解决您的问题
这种行为direct组件因为direct是同步组件,这也可能与在第三条路由中使用聚合器有关
例如:
from("direct:a") [...]
.to("seda:c");
from("direct:b") [...]
.to("seda:c");
from(seda:c) <your aggregator functionality comes here>
.to("direct:someOtherRoute");
而且,可能
completionTimeout
太低了…试试下面的方法,这只是一个示例
from(“计时器:foo?重复计数=1,延迟=1000”).routeId(“第一条路线”)
.SEBODY(简单(“sundar”)。至(“直接:a”)
您可以使用seda或Yakunin指出的其他异步路由。这里使用聚合器的主要争用点是completionSize,我在这里使用了2,因为有两条路由在发送消息。尝试下面的方法,这只是一个示例 from(“计时器:foo?重复计数=1,延迟=1000”).routeId(“第一条路线”) .SEBODY(简单(“sundar”)。至(“直接:a”)
您可以使用seda或Yakunin指出的其他异步路由。这里使用聚合器的主要争用点是completionSize,我在这里使用了2,因为有两条路由正在发送消息。谢谢Sunar!事实上,我在原始代码中也做了同样的操作,但没有使用计时器,因此无法工作。我还没有试过你的样品,但如果“第一条路线”和“第二条路线”在“direct:a”着陆,那就太好了。我没有用.end()关闭我的路由。您认为这是一个问题吗?这不重要,但请记住,聚合的完成策略很重要。所有路线都将在direct:a结束。谢谢Sunar!事实上,我在原始代码中也做了同样的操作,但没有使用计时器,因此无法工作。我还没有试过你的样品,但如果“第一条路线”和“第二条路线”在“direct:a”着陆,那就太好了。我没有用.end()关闭我的路由。您认为这是一个问题吗?这不重要,但请记住,聚合的完成策略很重要。所有路线都将在direct:a结束。嗨,Alexey,谢谢你的回复。我试过了,但没有解决问题。请参阅原始帖子中的“编辑”。还有其他想法吗?谢谢,这就解决了。另外,我现在也遇到了一个问题,一些数据被混淆了,但是原来的问题已经解决了,聚合器被收集了两次。如果我不知道为什么,也许我会提出一个与此相关的不同问题。嗨,亚历克赛,谢谢你的回答。我试过了,但没有解决问题。请参阅原始帖子中的“编辑”。还有其他想法吗?谢谢,这就解决了。另外,我现在也遇到了一个问题,一些数据被混淆了,但是原来的问题已经解决了,聚合器被收集了两次。如果我不明白为什么,也许我会提出一个与此相关的不同问题。
from("direct:a") [...]
.to("seda:c");
from("direct:b") [...]
.to("seda:c");
from(seda:c) <your aggregator functionality comes here>
.to("direct:someOtherRoute");
from("vm:AGGREGATOR").routeId("AGGREGATOR")
.aggregate().simple("${header.AGG}",String.class) // ${property.AGG}
.aggregationStrategy(new RecordAggregator())
.completionInterval(AGGREGATOR_TIMEOUT) //.completionTimeout(AGGREGATOR_TIMEOUT)
.forceCompletionOnStop()
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
LOGGER.info("### Process AGGREGATOR");
[...]
}
})
.marshal().csv()//.tracing()
.to("file:extract?fileName=${in.header.AGG}.csv&fileExist=Override")
.end();
from("timer:foo1?repeatCount=1&delay=1000").routeId("secondRoute")
.setBody(simple("sundar1")).to("direct:a");
from("direct:a")
.aggregate(new AggregationStrategy() {
@Override
public Exchange aggregate(Exchange arg0, Exchange arg1) {
Exchange argReturn = null;
if (arg0 == null) {
argReturn= arg1;
}
if (arg1 == null) {
argReturn= arg0;
}
if (arg1 != null && arg0 != null) {
try {
String arg1Str = arg1.getIn()
.getMandatoryBody().toString();
String arg2Str = arg0.getIn()
.getMandatoryBody().toString();
arg1.getIn().setBody(arg1Str + arg2Str);
} catch (Exception e) {
e.printStackTrace();
}
argReturn= arg1;
}
return argReturn;
}
}).constant(true).completionSize(2)
.to("direct:b").end();
from("direct:b").to("log:sundarLog?showAll=true&multiline=true");