在Apache Camel 3.7.2中,GroupedExchange是通过AbstractListAggregationStrategy类来实现的。该类在对消息进行聚合时会将它们存储在一个List中,因此Exchange.GROUPED_EXCHANGE属性将包含该List。在聚合完成后,该List将被替换为单个Exchange,其中包含所有聚合后的消息。
在之前的版本中,Exchange.GROUPED_EXCHANGE属性仍然包含List,因此它在聚合后可用。如果您的代码依赖于此属性,则需要进行相应的修改。
一种解决方法是使用Exchange.AGGREGATED_COMPLETED_BY设置来绕过此问题。这将覆盖默认的聚合策略,并在聚合完成时将Exchange设置为完成状态。以下是示例代码:
from("direct:aggregate")
.aggregate(constant(true), new MyAggregationStrategy())
.completionSize(10)
.completionTimeout(5000)
.setHeader(Exchange.AGGREGATED_COMPLETED_BY, "consumer")
.to("mock:result");
public class MyAggregationStrategy implements AggregationStrategy {
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
if (oldExchange == null) {
List list = new ArrayList();
list.add(newExchange);
newExchange.setProperty(Exchange.GROUPED_EXCHANGE, list);
return newExchange;
} else {
List list = oldExchange.getProperty(Exchange.GROUPED_EXCHANGE, List.class);
list.add(newExchange);
return oldExchange;
}
}
}
在上面的示例中,我将Exchange.AGGREGATED_COMPLETED_BY设置为“consumer”。这意味着当所有消息被聚合时,会话将由消息的最终消费者完成。如果不指定此设置,则使用默认设置,可能无法正常使用Exchange.GROUPED_EXCHANGE。