Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache camel ApacheCamel:同一条路由的多条路由_Apache Camel - Fatal编程技术网

Apache camel ApacheCamel:同一条路由的多条路由

Apache camel ApacheCamel:同一条路由的多条路由,apache-camel,Apache Camel,我希望将消息从多个路由路由到同一路由,但它的工作方式与我假设的不同。我设置了以下内容(我只是记下要点): 我也测试了它,但在我的情况下,它没有产生任何成果 EDIT2: 我在此添加如何使用聚合器,即本例中的路由“c”: from("vm:AGGREGATOR").routeId("AGGREGATOR") .aggregate( constant("AGG"), new RecordAggregator()) .completionTimeout(AGGREGAT

我希望将消息从多个路由路由到同一路由,但它的工作方式与我假设的不同。我设置了以下内容(我只是记下要点):

我也测试了它,但在我的情况下,它没有产生任何成果

EDIT2:

我在此添加如何使用聚合器,即本例中的路由“c”:

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值创建一个文件。这种理解正确吗?

我认为使用异步组件,如sedavmactivemq可能会解决您的问题

这种行为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
太低了…

我认为使用异步组件,例如sedavmactivemq可能会解决您的问题

这种行为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");