Camel AggregationStrategy表现出乎意料

时间:2013-12-17 20:15:06

标签: java apache-camel soa aggregation

我有一种情况需要将数据传递到Aggregator,但我不希望聚合器在收到来自3条不同路由的消息之前做任何事情:

<route id="route-1">
    <from uri="direct:fizz" />

    <to uri="bean:bean1?method=process" />

    <setHeader headerName="id">
        <constant>1</constant>
    </setHeader>

    <to uri="direct:aggregator" />
</route>

<route id="route-2">
    <from uri="direct:buzz" />

    <to uri="bean:bean2?method=process" />

    <setHeader headerName="id">
        <constant>2</constant>
    </setHeader>

    <to uri="direct:aggregator" />
</route>

<route id="route-3">
    <from uri="direct:foo" />

    <to uri="bean:bean3?method=process" />

    <setHeader headerName="id">
        <constant>3</constant>
    </setHeader>

    <to uri="direct:aggregator" />
</route>

<route id="aggregator-route">
    <from uri="direct:aggregator" />

    <aggregate strategyRef="myAggregationStrategy" completionSize="1">
        <correlationExpression>
            <simple>header.id</simple>
        </correlationExpression>
        <to uri="bean:lastBean?method=process" />
    </aggregate>
</route>

配置方式,当聚合器的completionSize设置为1或2时,聚合的Exchange将路由到我的lastBean。但是,如果我将completionSize设置为3,由于某种原因,lastBean#process永远不会被调用。

肯定我在这里错误地使用了header.id和聚合器。在correlationExpression中,我只需要确保我们从3条路线中分别收到1条消息。

所以我的问题:我需要做什么才能使我的聚合器“等待”,直到它收到来自route-1的1条消息,来自route-2的1条消息和来自{{的1条消息1}}吗

1 个答案:

答案 0 :(得分:2)

如果要关联来自三条路线的消息,则需要有一种方法让它们在到达聚合路径时具有匹配的header.id值。

在您的示例中,每个路由设置不同的id值,因此不会匹配。如果你在每条路线中将id值设置为“1”,我认为它会按预期开始工作。