Да, GroupedExchangeAggregationStrategy
ничего не делает, кроме как создает java.util.List
из всех Обменов .С другой стороны, Splitter EIP разделяет список по элементам и помещает элемент в тело сообщения.Поэтому в итоге вы получите Exchange, который содержит Exchange в своем теле.
Вам нужна AggregationStrategy, которая собирает все объекты тела в списке вместо всех обменов.
Вы можете попытаться использовать Camels FlexibleAggregationStrategy
, который настраивается через свободный API .
new FlexibleAggregationStrategy () .storeInBody () .accumulateInCollection (ArrayList.class) .pick (new SimpleExpression ("$ {body}"));
Это должно создать AggregationStrategy, которая извлекает тело каждого сообщения (возможно, вы можете опустить метод выбора, так как извлечение тела является выбором по умолчанию), собирает их в список и сохраняет агрегацию в теле сообщения.
Чтобы снова разбить эту совокупность, достаточно простого split(body())
.
РЕДАКТИРОВАТЬ из-за комментария
Да, вы правы, побочным эффектом моего решения является то, что вы теряете свойства и заголовки исходных сообщений, поскольку оно объединяет толькотел сообщений.
То, что вы хотите сделать, это разделить Список бирж обратно на оригиналы.то есть Splitter не должен создавать новые биржи, а должен использовать уже существующие и выбрасывать агрегированную оболочку Exchange.
Насколько я вижу в исходном коде Splitter , это в настоящее время невозможно :
Exchange newExchange = ExchangeHelper.createCorrelatedCopy(copy, false);
...
if (part instanceof Message) {
newExchange.setIn((Message) part);
} else {
Message in = newExchange.getIn();
in.setBody(part);
}