Camel Aggregator误解

时间:2014-02-10 03:38:50

标签: split apache-camel aggregate

我想知道是否有人可以解释为什么GroupedExchangeAggregationStrategy没有做我希望它应该做的事情。

我有一个正确切开的消息列表,每个消息都传递给我的路由进程。从这条路线,聚合器应收集所有响应并将它们组合在一个不错的最终交换中并返回它。

然而,我看到每个分裂的消息都被正确执行。但聚合器似乎并没有将它们组合在一起。相反,父路由以原始消息结束。这是我将使用默认的Camel DefaultAggregationCollection和UseLatestAggregationStrategy看到的行为。但是,如果我将策略更改为GroupedExchangeAggregationStrategy,我不应该看到别的东西吗?

似乎聚合器中的路由根本没有执行。我在路线的起点和终点后都有评论,但它们从未打印过。

这是我的分裂:

                <split>
                    <simple>${body}</simple>
                    <to uri="direct:splitprocess"/>
                </split> 
                <aggregate parallelProcessing="true" strategyRef="productAgrregator" >
                    <correlationExpression><simple>${headers.correlationId}</simple></correlationExpression>
                     <completionSize>
                        <simple>${headers.resultSize}</simple>
                     </completionSize>
                    <to uri="direct:aggregated"/>
                </aggregate>

以下是直接路线:聚合:

        <route id="aggregated">
            <from uri="direct:aggregated"/>
            <log message="Starting aggregation with message: ${body}"/>
            <removeHeaders pattern="Exchange.CONTENT_ENCODING"/>
            <transform>
                <simple>${property.CamelGroupedExchange}</simple>
            </transform>
            <log message="Aggregated message: ${body}"/>
        </route>

这是我定义战略的地方:

<bean id="productAgrregator" class="org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy"/>

令我困惑的另一件事是我指定parallelProcessing =“true”,但在日志中,我仍然看到以下语句:完成顺序处理3个交换。这不应该是并行处理吗?

我还尝试简单地指定groupExchanges =“true”,而不是使用GroupedExchangeAggregationStrategy。它没有任何帮助。

正如你所看到的,我很困惑。

下面是一个完全孤立的例子。可以通过提供JSON主体的POST请求来调用它,例如:{“zero”:“”,“one”:“”}。我的期望是收到类似的东西: {one = 1A,zero = 0A}或{one = 0A,zero = 1A}。相反,我得到{zero =,one =}。

        <route id="split">
            <from uri="restlet:/split?restletMethod=POST"/>
            <unmarshal ref="json"/>
            <setHeader headerName="bodySize"><simple>${body.size()}</simple></setHeader>
            <setHeader headerName="correlationId"><constant>'12345'</constant></setHeader>
            <split>
                <simple>${body}</simple>
                <to uri="direct:split-process"/>
                <aggregate parallelProcessing="true" groupExchanges="true">
                    <camel:correlationExpression><simple>${headers.correlationId}</simple></camel:correlationExpression>
                    <camel:completionSize><simple>${headers.bodySize}</simple></camel:completionSize>
                    <camel:to uri="direct:split-aggregate"/>
                </aggregate>
            </split>
        </route>


        <route id="split-process">
            <from uri="direct:split-process"/>
            <transform>
                <simple>${body} ${headers.CamelSplitIndex}A</simple>
            </transform>
        </route>            

        <route id="split-aggregate">
            <from uri="direct:split-aggregate"/>
            <to uri="mock:results"/>
        </route>            

2 个答案:

答案 0 :(得分:3)

以下是我最终的结果:

  1. 无需使用额外的聚合器。 Split有一个内置的聚合器,如文档(http://camel.apache.org/splitter.html#Splitter-WhattheSplitterreturns)中所述。我引用:“这个Splitter可以被视为具有轻质聚合器的构建。”

  2. 实施自定义策略以组合交换。 GroupedExchangeAggregationStrategy似乎只返回一条消息。我假设最后一个处理过的。自定义策略是逐字复制的StringAggregationStrategy:http://camel.apache.org/aggregator2.html

  3. 所以,最后我的路线看起来很简单:

          <route id="split">
                <from uri="restlet:/split?restletMethod=POST"/>
                <split parallelProcessing="true" strategyRef="strategy">
                    <tokenize token=","/>
                    <transform>
                        <simple>${body} ${headers.CamelSplitIndex}CD</simple>
                    </transform>
                </split>
            </route> 
    

答案 1 :(得分:1)

我会在这里找到答案。

由于您的<aggregate...>超出了<split>,因此只有1条消息被发送到聚合器,因此永远无法达到完成限制。

        <split>
            <simple>${body}</simple>
            <to uri="direct:splitprocess"/>
            <aggregate parallelProcessing="true" strategyRef="productAgrregator" >
                <correlationExpression><simple>${headers.correlationId}</simple></correlationExpression>
                 <completionSize>
                    <simple>${headers.resultSize}</simple>
                 </completionSize>
                <to uri="direct:aggregated"/>
            </aggregate>
        </split> 

手指越过这将起作用......;)