FlexibleAggregationStrategy

FlexibleAggregationStrategy

我正在尝试使用apache camel 2.14在spring xml中配置apache camel路由。该路线将涉及<aggregator><enrich>/<pollEnrich>;我还没有足够的经验与骆驼知道哪个eip将是最有用的。不管怎样,我都需要一个aggregationStrategy。我的最终目标是为希望用xml配置路由的客户机创建一个camel路由。
通过在网上搜索,我了解到了一个名为FlexibleAggregationStrategy的camel类的存在。我发现的东西声称,我引用,“它能让你很快
创建一个aggregationstrategy,它能够在没有java代码的情况下执行最典型的聚合任务。“这对我来说很有用,因为我们需要尽可能多的xml配置。因此,最好不要用java编写我自己的AggregationStrategy。问题是,我不知道如何使用FlexibleAggregationStrategy
据我所知,FlexibleAggregationStrategy使用名为ExpressionpickExpression从消息中选取要聚合的元素,并筛选出与PredicateconditionPredicate匹配的消息。所以,我想我需要有一种方法在我的spring xml中设置这些值。不幸的是,我还没有得到以下代码块:
属性名设置为pickExpression,值为元素:

<bean id="FlexibleAggregationStrategy"
    class="org.apache.camel.util.toolbox.FlexibleAggregationStrategy">
    <property name="pickExpression">
        <xpath>
            //ID
        </xpath>
    </property>
</bean>

属性名设置为pick,值为元素:
<bean id="FlexibleAggregationStrategy"
    class="org.apache.camel.util.toolbox.FlexibleAggregationStrategy">
    <property name="pick">
        <xpath>
            //ID
        </xpath>
    </property>
</bean>

属性名设置为pickExpression,值为属性:
<bean id="FlexibleAggregationStrategy"
    class="org.apache.camel.util.toolbox.FlexibleAggregationStrategy">
    <property name="pickExpression" value="&lt;xpath&gt;//ID&lt;/xpath&gt;"/>
</bean>

属性名设置为pick,值为属性:
<bean id="FlexibleAggregationStrategy"
    class="org.apache.camel.util.toolbox.FlexibleAggregationStrategy">
    <property name="pick" value="&lt;xpath&gt;//ID&lt;/xpath&gt;"/>
</bean>

每次,我都会收到一个错误,抱怨它找不到我给它命名的属性描述符。我同时尝试pickpickExpression的原因是,在what appears to be the source code for FlexibleAggregationStrategy中,类中保存pick表达式的变量名为pickExpression,但设置它的方法只称为pick()
我对spring xml没有很好的理解,但是根据我所知道的,使用<property>标记设置变量值需要bean为该变量提供getter和setter。因为FlexibleAggregationStrategy没有用于pickExpression的getter和setter,所以我仍然遵循错误的方法。但是,如果我正确地读取了the XML Schema Definition for the <bean> tag,那么向bean发送信息的唯一方法是使用<property>标记或构造函数参数。因为FlexibleAggregationStrategy没有设置pickExpression的构造函数,所以我没有找到不编写java代码就配置FlexibleAggregationStrategy的方法。
我找到了对“方法注入”的引用,它可能允许我配置FlexibleAggregationStrategy。然而,我发现的唯一指令涉及到用java编写bean。因此,这种技术还包括编写java代码;此外,似乎编写自己的AggregationStrategy会更快、更直接。
到目前为止,记录<aggregator>模式的新旧apache camel wiki页面都没有提到FlexibleAggregationStrategy
我尝试在google上搜索FlexibleAggregationStrategy这个词,看看是否有人编写了使用FlexibleAggregationStrategy的教程或文档。到目前为止,我得到的前两个google结果是为FlexibleAggregationStrategy类自动生成的javadoc。第三个结果是上面链接的github托管源代码。第四个结果是我发布的关于这个主题的另一个问题;这个问题被关闭了,因为我不知道如何编写适当的stackoverflow问题。第五个结果是grepcode.com上托管的源代码。第六个结果是一个接口的javadoc,我不明白。第七个结果是其他人在grokbase.com上问的问题;这个问题没有答案。Eigth的结果是其他人在qnalist.com上问的一个同样没有答案的问题。第九个结果似乎来自提交FlexibleAggregationStrategy类源代码的邮件列表。第十个结果是grokbase发布到osdir.com的问题。类似的搜索返回的结果基本相同;我发现的其他新结果同样没有帮助。我认为,如果有人为使用FlexibleAggregationStrategy编写了一个很好的指南,就会出现在这些搜索中。
是否有人使用过FlexibleAggregationStrategy可以告诉我如何设置pickExpressionconditionPredicate以便我可以使用FlexibleAggregationStrategy?如果你知道我需要配置它的任何其他东西,或者它周围的任何其他常见陷阱,也会很感激这些信息。
谢谢你抽出时间。

最佳答案

看看JavaDoc,我会说这个类不是CAMEL XML DSL友好的,并打算与CAMEL流利的Java DSL一起使用。如果你想和spring dsl一起使用,那你就倒霉了。
通过使用xpath表达式转换扩展路由中的结果体,然后将其与UseLatestAggregationStrategy聚合,您的用例可能更容易实现,这实际上使扩展交换成为聚合的结果:

<bean id="useLatest" class="org.apache.camel.processor.aggregate.UseLatestAggregationStrategy"/>

<camel:route id="main">
    ...
    <camel:enrich uri="direct:enrich" strategyRef="useLatest"/>
    ...
</camel:route>

<camel:route id="enrichment">
    <camel:from uri="direct:enrich"/>

    ...enrichment processing here...

    <camel:setBody>
        <camel:xpath>//ID</camel:xpath>
    </camel:setBody>
</camel:route>

希望能有所帮助。

09-08 02:52