I have routes that have following definition.
public class HttpRouteBuilder extends RouteBuilder {
...
@Override
public void configure() throws Exception {
from(ICallbackServiceManager.ORIGIN_ENDPOINT)
.filter(PredicateBuilder.and(
header(ICallbackEvent.EVENT_HEADER_IS_TEST).isEqualTo(allowTestEvent),
header(ICallbackEvent.EVENT_HEADER_EVENT_TYPE).isEqualTo(eventType.name()),
PredicateBuilder.or(
header(ICallbackEvent.EVENT_HEADER_SVC_ID).in(httpEndpoint._getKeywords().toArray()),
header(ICallbackEvent.EVENT_HEADER_SVC_ID).regex(httpEndpoint._getKeywords().get(0))
)
))
.routeId((allowTestEvent) ?
httpEndpoint._getTestRouteId() : httpEndpoint.getRouteId())
.*aggregate(constant(true), new
BasicBodyListAggregator())*
.completionSize(Config.getInt("callbacks.route.aggregate.size", 2))
.completionInterval(Config.getInt("callbacks.route.aggregate.interval",
1000))
.setHeader(Exchange.HTTP_METHOD, constant("POST"))
.setHeader(Exchange.CONTENT_TYPE,
constant(dataFormat.getClass().equals(XStreamDataFormat.class) ?
"application/xml" : "application/json"))
.setHeader(Exchange.HTTP_PROTOCOL_VERSION,
constant("HTTP/1.0"))
.marshal(dataFormat)
.to(httpEndpoint.endpointUri());
}
}
With aggregation strategy as:
public class BasicBodyListAggregator implements AggregationStrategy {
@Override
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
Object newBody = newExchange.getIn().getBody();
ArrayList list = null;
if (oldExchange == null) {
list = new ArrayList();
list.add(newBody);
newExchange.getIn().setBody(list);
return newExchange;
} else {
list = oldExchange.getIn().getBody(ArrayList.class);
list.add(newBody);
return oldExchange;
}
}
}
The issue is , when only one exchange is processed within the
completionInterval of 1s, the serialized output does not include a list
(containing 1 single message), rather a single message itself.
{
"list": {
"ExternalEvent": *{
"eventTime": 1408900445,
"phoneNo": 9739772042,
"content": "FK OFFERS something",
"carrier": "vodafone",
"location": "Bangalore"
}*
}
}
When it should be:
{
"list": {
"ExternalEvent": *[
{
"eventTime": 1408900445,
"phoneNo": 9739772042,
"content": "FK OFFERS something",
"carrier": "vodafone",
"location": "Bangalore"
}
]*
}
}
However, it just works fine, when more than 1 exchange is processed in
completionInterval.
{
"list": {
"ExternalEvent": [
{
"eventTime": 1408900445,
"phoneNo": 9739772042,
"content": "FK OFFERS something",
"carrier": "vodafone",
"location": "Bangalore"
},
{
"eventTime": 1408900448,
"phoneNo": 9232977242,
"content": "FK OFFERS something",
"carrier": "vodafone",
"location": "Bangalore"
}
]
}
}
Any help / pointers would be appreciated.
Thanks,
Durga
--
View this message in context:
http://camel.465427.n5.nabble.com/Issue-in-marshal-with-aggregation-tp5761125.html
Sent from the Camel - Users mailing list archive at Nabble.com.