Exchange.GROUPED_EXCHANGE 在 Apache Camel 3.7.2 中聚合后不可用
Exchange.GROUPED_EXCHANGE not available after aggregation in Apache Camel 3.7.2
从Apache Camel 2.x升级到3.7.2后我们在Java11项目中体验路线配置 class 中的一些粗鲁之处,扩展了 RouteBuilder
(Documentation) class. With Camel 2 I used the SimpleExpression ${property[" + Exchange.GROUPED_EXCHANGE + "]}
, which has now been renamed in Camel 3.x to exchangeProperty
(Migration Guide)。到目前为止,还不错。
@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(...)
聚合后预期的 return 应该是一个对象列表,可通过 CamelGroupedExchange
或 ${exchangeProperty[" + Exchange.GROUPED_EXCHANGE + "]}
访问,但它被 [=20 中的 newExchange
覆盖=].
由于我们没有找到更多证据,有人可以解释一下升级 Camel 到 3.7.2 后出现的这种奇怪行为吗?也许 ExchangeHelper 和可用的 ExchangePattern/MEP 模式 (CAMEL-13286) 发生了重大变化,但我们无法解决问题。
感谢大家的帮助!
我们发现 Camel 3.7.2 中的 AbstractListAggregationStrategy
现在将 属性 设置为 In
主体:
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()
.
访问交易所列表
从Apache Camel 2.x升级到3.7.2后我们在Java11项目中体验路线配置 class 中的一些粗鲁之处,扩展了 RouteBuilder
(Documentation) class. With Camel 2 I used the SimpleExpression ${property[" + Exchange.GROUPED_EXCHANGE + "]}
, which has now been renamed in Camel 3.x to exchangeProperty
(Migration Guide)。到目前为止,还不错。
@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(...)
聚合后预期的 return 应该是一个对象列表,可通过 CamelGroupedExchange
或 ${exchangeProperty[" + Exchange.GROUPED_EXCHANGE + "]}
访问,但它被 [=20 中的 newExchange
覆盖=].
由于我们没有找到更多证据,有人可以解释一下升级 Camel 到 3.7.2 后出现的这种奇怪行为吗?也许 ExchangeHelper 和可用的 ExchangePattern/MEP 模式 (CAMEL-13286) 发生了重大变化,但我们无法解决问题。
感谢大家的帮助!
我们发现 Camel 3.7.2 中的 AbstractListAggregationStrategy
现在将 属性 设置为 In
主体:
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()
.