在Apache Camel 3.7.2中进行聚合后,Exchange.GROUPED_EXCHANGE不可用

mwngjboj  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(148)

在Java 11项目中从Apache Camel2.x升级到3.7.2后,我们在路由配置类中遇到了一些粗糙的地方,扩展了RouteBuilder(Documentation)类。在Camel 2中,我使用了SimpleExpression ${property[" + Exchange.GROUPED_EXCHANGE + "]},它现在在Camel 3.x中被重命名为exchangeProperty(迁移指南)。到目前为止,一切都很好。

@Override
public void configure() throws Exception {

    final SimpleExpression documentAppendix =
        new SimpleExpression("${body.appendix}");

    final SimpleExpression groupedExchanges =
        new SimpleExpression("${exchangeProperty[" + Exchange.GROUPED_EXCHANGE + "]}");

    from("direct://input")
        .choice()
            .when(documentAppendix)
                .split(documentAppendix, new GroupedExchangeAggregationStrategy())
                .to("direct://input.splitted")
                .end()
                .setBody(groupedExchanges)
                .endChoice()
            .otherwise()
                .setBody(constant(Lists.newArrayList()))
        .end();

    // ... omitted

}

运行测试后,所有测试都失败了,因为主体没有包含预期数量的附录。起初,我们认为exchangeProperty可能有问题,但在调试器上花了一段时间后,我们发现了以下属性“丢失”的痕迹:

GroupedExchangeAggregationStrategy
                         |
                         v
           AbstractListAggregationStrategy
(This class sets the "CamelGroupedExchange" property!)
                         |
                         v
                 AggregateProcessor
                 doAggregation(...)
       ExchangeHelper.preparteAggregation(...)

聚合后的预期返回值应该是一个对象列表,可通过CamelGroupedExchange${exchangeProperty[" + Exchange.GROUPED_EXCHANGE + "]}访问,但它会被ExchangeHelper.preparteAggregation中的newExchange覆盖。
由于我们没有找到更多的证据,有人能解释一下将Camel升级到3.7.2后的这种奇怪行为吗?也许ExchangeHelper和可用的ExchangePattern/MEP模式(CAMEL-13286)中有重大更改,但我们无法解决这个问题。
谢谢你们的帮助!

kgqe7b3p

kgqe7b3p1#

我们发现Camel 3.7.2中的AbstractListAggregationStrategy现在在完成时将属性设置为In body:

public abstract class AbstractListAggregationStrategy<V> implements AggregationStrategy {
    public AbstractListAggregationStrategy() {
    }

    public abstract V getValue(Exchange exchange);

    public boolean isStoreAsBodyOnCompletion() {
        return true;
    }

    public void onCompletion(Exchange exchange) {
        if (exchange != null && this.isStoreAsBodyOnCompletion()) {
            List<V> list = (List)exchange.removeProperty("CamelGroupedExchange");
            if (list != null) {
                exchange.getIn().setBody(list);
            }
        }

    }

    // omitted

}

通过此更改,我们的.setBody(groupedExchanges)是冗余的,我们能够通过getIn()访问交换列表。

相关问题