Агрегация верблюдовСтратегия, производящая сообщения NULL

63
3

В настоящее время у меня есть следующий маршрут Верблюд:

<camelContext id="my-camel-context" xmlns="http://camel.apache.org/schema/spring">
<propertyPlaceholder id="envProps" location="classpath:myapp.properties" />
<route id="my-camel-route">
<from uri="{{start.uri}}"/>

<setHeader headerName="id">
<constant>1</constant>
</setHeader>

<to uri="bean:preProcessor?method=process" />

<aggregate strategyRef="myAggregationStrategy" completionSize="1">
<correlationExpression>
<simple>${header.id} == 1</simple>
</correlationExpression>
<to uri="bean:postProcessor?method=process" />
</aggregate>

<to uri="bean:mailer?method=process" />
</route>
</camelContext>

<bean id="myAggregationStrategy" class="com.me.myapp.MyAggregationStrategy" />
<bean id="postProcessor" class="com.me.myapp.PostProcessor" />
<bean id="mailer" class="com.me.myapp.Mailer" />

Пока что я не собираю ничего значимого (completionSize=1), я просто тестирую AggregationStrategy. Здесь моя стратегия:

public class MyAggregationStrategy implements AggregationStrategy {
@Override
public Exchange aggregate(Exchange aggregatingExchange, Exchange incomingExchange) {
AppPayload payload = null;

if(aggregatingExchange == null)
payload = new AppPayload(); // This should prevent it from being NULL below in PostProcessor...
else
payload = (AppPayload)incomingExchange.getIn().getBody();

payload.setCargo((Order)incomingExchange.getIn().getBody());

if(aggregatingExchange == null) {
incomingExchange.getIn().setBody(payload);
return incomingExchange;
}
else
return aggregatingExchange;
}
}

А также мой компонент postProcessor:

public class PostProcessor implement Processor {
@Override
public void process(Exchange exchange) {
try {
System.out.println("In PostProcessor...");
AppPayload payload = (AppPayload)exchange.getIn().getBody();
System.out.println("\t...payload acquired...");

if(payload == null)
System.out.println("Payload is NULL.");
} catch(Throwable throwable) {
System.out.println(ExceptionUtils.getFullStackTrace(throwable));
}
}
}

Когда я запускаю этот код, я вижу сообщения журнала из моего preProcessor bean, которые inidcate он выполняет правильно. И я также вижу, что MyAggregationStrategy правильно "агрегирует" сообщение, а затем позволяет ему перейти к postProcessor после получения первого сообщения (опять же, поскольку postProcessor completionSize=1). Тем не менее, я получаю следующий вывод в postProcessor:

In PostProcessor...
...payload acquired...
Payload is NULL.

Может ли кто-нибудь понять, почему payload будет NULL? Не следует ли его инициализировать внутри MyAggregationStrategy?!? Я рад опубликовать больше кода, но я считаю, что это связано с неправильным использованием API AggregationStrategy.

спросил(а) 2014-01-28T18:49:00+04:00 7 лет, 5 месяцев назад
1
Решение
63

Я считаю, что вы путаетесь с aggregatingExchange и incomingExchange. Можете ли вы попробовать это:

public class MyAggregationStrategy implements AggregationStrategy {
@Override
public Exchange aggregate(Exchange aggregatingExchange, Exchange incomingExchange) {
AppPayload payload = null;

if(aggregatingExchange == null) {
payload = new AppPayload(); // This should prevent it from being NULL below in PostProcessor...
} else {
payload = (AppPayload)aggregatingExchange.getIn().getBody();
}

payload.setCargo((Order)incomingExchange.getIn().getBody());

if(aggregatingExchange == null) {
incomingExchange.getIn().setBody(payload);
return incomingExchange;
} else {
return aggregatingExchange;
}
}
}

ответил(а) 2014-01-28T19:31:00+04:00 7 лет, 5 месяцев назад
45

Добавление к тому, что уже упоминалось в @hveiga. У меня была аналогичная проблема, которую я разрешил, добавив заголовок в мои сообщения. Однако в вашем случае я вижу, что вы не используете сплиттер и у вас уже есть заголовок. Таким образом, часть информации, полученной от Clauss Ibssen, заключалась в том, что первый обмен временем будет пустым, и нам нужно проверить нулевой объект.

См. Это для более подробного объяснения - Apache Camel - Split и aggregate - Старый Exchange всегда имеет значение null


Отслеживайте полное объяснение здесь - http://camel.465427.n5.nabble.com/Split-and-Aggregate-Old-Exchange-is-null-everytime-in-AggregationStrategy-td5746365.html

ответил(а) 2014-01-29T21:43:00+04:00 7 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема