如何在 Spring XML 中为 Apache Camel 的灵活聚合策略设置“选择”表达式?

2024-03-21

我正在尝试使用 Apache Camel 2.14 在 Spring XML 中配置 Apache Camel 路由。该路线将涉及<aggregator> or an <enrich>/<pollEnrich>;我对 Camel 的使用经验还不够,不知道哪个 EIP 最有用。不管怎样,我需要一个aggregationStrategy。我的最终目标是为希望在 XML 中配置路由的客户端创建 Camel 路由。

通过在互联网上搜索,我了解到存在一个名为 Camel 的类FlexibleAggregationStrategy。我发现的东西声称,我引用,“它可以让你快速 启动一个 AggregationStrategy,它能够用零 Java 代码执行最典型的聚合任务。”这对我来说听起来很有用,因为我们希望尽可能多地使用 XML 进行配置。因此,最好避免编写我自己的AggregationStrategy在爪哇。问题是,我不知道如何使用FlexibleAggregationStrategy.

据我所知,FlexibleAggregationStrategy使用以下方法从消息中选取元素进行聚合Expression called 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="&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>

每次,我都会收到一条错误消息,抱怨无法找到具有我指定名称的属性描述符。我尝试两者的原因pick and pickExpression就是说,在似乎是FlexibleAggregationStrategy的源代码 https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/util/toolbox/FlexibleAggregationStrategy.java,类中保存pick表达式的变量被命名为pickExpression,但设置它的方法只需调用pick().

我对 Spring XML 没有完全的理解,但根据我所知道的,使用<property>设置变量值的标记要求 bean 具有该变量的 getter 和 setter。自从FlexibleAggregationStrategy没有 getter 和 setterpickExpression,无论如何我都遵循了错误的方法。但是,如果我正在阅读XML 模式定义<bean> tag http://www.springframework.org/schema/beans/spring-beans.xsd正确地,向 bean 发送信息的唯一方法是使用<property>标记或带有构造函数参数。自从FlexibleAggregationStrategy没有设置的构造函数pickExpression,我还没有找到配置的方法FlexibleAggregationStrategy无需编写Java代码。

我发现了对“方法注入”的引用,它可能允许我配置FlexibleAggregationStrategy。然而,我发现的唯一说明涉及用 Java 编写 bean。因此,该技术还涉及编写 Java 代码;另外,我自己写似乎会更快更直接AggregationStrategy.

截至目前,新旧 Apache Camel Wiki 页面都没有记录<aggregator>模式没有提到FlexibleAggregationStrategy根本不。

我尝试在 Google 上搜索这个词FlexibleAggregationStrategy看看是否有人写过任何使用教程或文档FlexibleAggregationStrategy。截至目前,我获得的前两个 Google 结果是自动生成的 JavadocFlexibleAggregationStrategy班级。第三个结果是我上面链接的 github 托管的源代码。第四个结果是我发布的关于该主题的另一个问题;这个问题已关闭,因为我不明白如何编写正确的 StackOverflow 问题。第五个结果是 grepcode.com 上托管的源代码。第六个结果是我不理解的接口的 Javadoc。第七个结果是别人在grokbase.com上问的一个问题;这个问题没有答案。第八个结果是其他人在 qnalist.com 上提出的问题,但也没有答案。第九个结果似乎来自涉及提交源代码的邮件列表FlexibleAggregationStrategy班级。第十个结果是 grokbase 发布到 osdir.com 的问题。类似的搜索返回的结果大多相同;我发现其他新结果同样没有帮助。我认为,如果有人写了一个很好的使用指南FlexibleAggregationStrategy,它会出现在这些搜索中。

有没有人用过FlexibleAggregationStrategy谁能告诉我怎么设置pickExpression and conditionPredicate所以我可以用FlexibleAggregationStrategy?如果您知道我需要配置它的任何其他信息,或者围绕它的任何其他常见陷阱,我们也将不胜感激。

感谢您的时间。


Spring 的 XML 格式并不是真正适合流畅的构建器,但您可以做到。例如,要复制此内容:

delegateStrategy = new FlexibleAggregationStrategy<Object>()
        .storeInBody()
        .accumulateInCollection(ArrayList.class)
        .pick(new SimpleExpression("${header[CamelFileName]}"));

需要这个 XML:

<bean id="_flexible0" class="org.apache.camel.util.toolbox.FlexibleAggregationStrategy"/>
<bean id="_flexible1" factory-bean="_flexible0" factory-method="storeInBody" />
<bean id="_flexible2" factory-bean="_flexible1" factory-method="accumulateInCollection">
  <constructor-arg value="java.util.ArrayList" />
</bean>
<bean id="fileNameListStrategy" factory-bean="_flexible2" factory-method="pick">
  <constructor-arg>
    <bean class="org.apache.camel.model.language.SimpleExpression">
      <constructor-arg type="java.lang.String" value="${header[CamelFileName]}" />
    </bean>
  </constructor-arg>
</bean>

正如您所看到的,它不是很简洁,并且需要创建许多中间 bean,但这是可能的。

但是,如果您不限于零个自定义 Java,您可以创建自己的 AggregationStrategy,将其委托给FlexibleAggregationStrategy 并在 XML 中使用它。

Java部分:

public class FileNameListAggregationStrategy implements AggregationStrategy {

    private CompletionAwareAggregationStrategy delegateStrategy;

    public FileNameListAggregationStrategy() {
        delegateStrategy = new FlexibleAggregationStrategy<Object>()
                .storeInBody()
                .accumulateInCollection(ArrayList.class)
                .pick(new SimpleExpression("${header[CamelFileName]}"));
    }

    @Override
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
        return delegateStrategy.aggregate(oldExchange, newExchange);
    }

}

XML部分:

<bean id="fileNameListStrategy" class="org.example.camel.FileNameListStrategy"/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Spring XML 中为 Apache Camel 的灵活聚合策略设置“选择”表达式? 的相关文章

随机推荐