Java 我是否正确使用了Apache Camel聚合器?

Java 我是否正确使用了Apache Camel聚合器?,java,apache-camel,routes,aggregator,enterprise-integration,Java,Apache Camel,Routes,Aggregator,Enterprise Integration,我对Apache Camel术语中的路由的理解是,它表示从一个端点到另一个端点的数据流,并且在对数据执行EIP类型操作的过程中,它将在不同的处理器上停止 如果这是对路线的正确/公平评估,那么我正在建模一个问题,我认为它需要在我使用Spring的同一个上下文中有多条路线: 路由1:从源1提取数据,对其进行处理,将其转换为列表,然后将其发送到聚合器 路由2:从Source-2中提取数据,对其进行处理,并将其转换为列表,然后将其发送到聚合器 路由3:包含一个聚合器,它等待从路由1和路由2接收列表,然后

我对Apache Camel术语中的路由的理解是,它表示从一个端点到另一个端点的数据流,并且在对数据执行EIP类型操作的过程中,它将在不同的处理器上停止

如果这是对路线的正确/公平评估,那么我正在建模一个问题,我认为它需要在我使用Spring的同一个上下文中有多条路线:

路由1:从源1提取数据,对其进行处理,将其转换为列表,然后将其发送到聚合器 路由2:从Source-2中提取数据,对其进行处理,并将其转换为列表,然后将其发送到聚合器 路由3:包含一个聚合器,它等待从路由1和路由2接收列表,然后继续处理聚合列表 事情是这样的:两个列表需要同时到达聚合器,或者更确切地说,聚合器bean必须等到从两个路由接收到数据后,才能将这两个列表聚合为一个列表,并将聚合的列表发送到路由3的其余部分

到目前为止,我有以下伪代码:

然后在Java中:

public class ListAggregatorStrategy implements AggregatoryStrategy {
    public Exchange aggregate(Exchange exchange) {
        List<SomePOJO> route1POJOs = extractRoute1POJOs(exchange);
        List<SomePOJO> route2POJOs = extractRoute2POJOs(exchange);

        List<SomePOJO> aggregateList = new ArrayList<SomePOJO>(route1POJOs);
        aggregateList.addAll(route2POJOs);

        return aggregateList;
    }
}
我的问题 我的基本设置正确吗?换句话说,我是否正确使用direct:aggregator端点将数据从路由1和路由2发送到路由3的聚合器中? 我的聚合器会像我期望的那样工作吗?假设route-1中的提取器1bean只需要5秒运行,而route-2中的提取器2bean需要2分钟运行。在t=5时,聚合器应从提取器1接收数据,并开始等待2分钟,直到提取器2完成,并将剩余的数据提供给它进行聚合。对
听起来你的思路是对的,这个页面有很多关于这方面的好信息

是从每个路由匹配交换的关键,completionSize可以指定等待的数量。在您的情况下,似乎每个路由只设计为运行一次,在这种情况下,表达式可能使用来自每个交换的固定头值,否则您将需要每个路由的类似计数器类的内容

以下是对您的示例的更新:

<route id="route-1">
    <from uri="time://runOnce?repeatCount=1&amp;delay=10" />
    <to uri="bean:extractor1?method=process" />
    <setHeader headerName="id">
        <constant>myHeaderValue</constant>
    </setHeader>
    <to uri="direct:aggregator" />
</route>

<route id="route-2">
    <from uri="time://runOnce?repeatCount=1&amp;delay=10" />
    <to uri="bean:extractor2?method=process" />
    <setHeader headerName="id">
        <constant>myHeaderValue</constant>
    </setHeader>
    <to uri="direct:aggregator" />
</route>

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

    <aggregate strategyRef="listAggregatorStrategy" completionSize="2">
        <correlationExpression>
            <simple>header.id</simple>
        </correlationExpression>
        <to uri="bean:lastProcessor?method=process" />
    </aggregate>
</route>
<route id="route-1">
    <from uri="time://runOnce?repeatCount=1&amp;delay=10" />
    <to uri="bean:extractor1?method=process" />
    <setHeader headerName="id">
        <constant>myHeaderValue</constant>
    </setHeader>
    <to uri="direct:aggregator" />
</route>

<route id="route-2">
    <from uri="time://runOnce?repeatCount=1&amp;delay=10" />
    <to uri="bean:extractor2?method=process" />
    <setHeader headerName="id">
        <constant>myHeaderValue</constant>
    </setHeader>
    <to uri="direct:aggregator" />
</route>

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

    <aggregate strategyRef="listAggregatorStrategy" completionSize="2">
        <correlationExpression>
            <simple>header.id</simple>
        </correlationExpression>
        <to uri="bean:lastProcessor?method=process" />
    </aggregate>
</route>