我正在尝试使用apache camel 2.14在spring xml中配置apache camel路由。该路线将涉及<aggregator>
或<enrich>
/<pollEnrich>
;我还没有足够的经验与骆驼知道哪个eip将是最有用的。不管怎样,我都需要一个aggregationStrategy
。我的最终目标是为希望用xml配置路由的客户机创建一个camel路由。
通过在网上搜索,我了解到了一个名为FlexibleAggregationStrategy
的camel类的存在。我发现的东西声称,我引用,“它能让你很快
创建一个aggregationstrategy,它能够在没有java代码的情况下执行最典型的聚合任务。“这对我来说很有用,因为我们需要尽可能多的xml配置。因此,最好不要用java编写我自己的AggregationStrategy
。问题是,我不知道如何使用FlexibleAggregationStrategy
。
据我所知,FlexibleAggregationStrategy
使用名为Expression
的pickExpression
从消息中选取要聚合的元素,并筛选出与Predicate
conditionPredicate
匹配的消息。所以,我想我需要有一种方法在我的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="<xpath>//ID</xpath>"/>
</bean>
属性名设置为
pick
,值为属性:<bean id="FlexibleAggregationStrategy"
class="org.apache.camel.util.toolbox.FlexibleAggregationStrategy">
<property name="pick" value="<xpath>//ID</xpath>"/>
</bean>
每次,我都会收到一个错误,抱怨它找不到我给它命名的属性描述符。我同时尝试
pick
和pickExpression
的原因是,在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
可以告诉我如何设置pickExpression
和conditionPredicate
以便我可以使用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>
希望能有所帮助。