在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)中有重大更改,但我们无法解决这个问题。
谢谢你们的帮助!
1条答案
按热度按时间kgqe7b3p1#
我们发现Camel 3.7.2中的
AbstractListAggregationStrategy
现在在完成时将属性设置为In
body:通过此更改,我们的
.setBody(groupedExchanges)
是冗余的,我们能够通过getIn()
访问交换列表。