[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: What route returns

Hi Hrvoje,
there is an example[1] in the documentation that does something
similar to what I think you want to do, also in the splitter docs[2]
there is a note on what the splitter step returns.

Here is a super simple example to illustrate this:

        .setBody(constant("a b c"))
        .split(body().tokenize(" "), AggregationStrategies.groupedBody())

Here the body of `"a b c"` is split on the space token and aggregated
by the splitter by grouping the body of each child processing into a
java.util.List, processing is super simple it just converts `"x"` to
`"*x*"`, next processor after splitter now gets a java.util.List of
bodies from transform processor, in this example that processor would
just marshal the java.util.List to JSON array, so the output should be

I'm not 100% sure I follow the logic of the route you provided, but it
seems to me that the second JMS processor, i.e. the one followed by
the `aggregate`, should be nested within the split step.

Just remember that when you use the split step with
AggregationStrategy it's the split step the one that aggregates the
results. A while back Torsten Mielke wrote a really good explanation
on the aggregator[3] that you might want to take a look at.


[1] https://github.com/apache/camel/blob/master/camel-core/src/main/docs/eips/split-eip.adoc#split-aggregate-requestreply-sample
[2] https://github.com/apache/camel/blob/master/camel-core/src/main/docs/eips/split-eip.adoc#what-the-splitter-returns
[3] https://tmielke.blogspot.de/2009/01/using-camel-aggregator-correctly.html

On Tue, Apr 24, 2018 at 5:20 PM, Hrvoje Djurdjevic
<hrvoje.djurdjevic@xxxxxxxxx> wrote:
> Hi,
> I notice that if I split body without referencing aggregation strategy,
> like this: split().body()
> route returns the message like it was before splitting.
> However, if I reference aggregation strategy in a split call like
> this: .split(body(),new AggrStrat())
> then route returns the message after aggregation. However, if I want to do
> further tasks in a route after aggregator, in which I reference the same
> strategy as in a splitter,
> such as for example unmarshalling the aggregated message from fixedlength
> format and marshalling into json, although these tasks were properly done,
> which I can verify by logging body, the REST route that is calling the
> observed route still receives the aggregated fixedlength message format.
> So, basically I see json printed in java console, but in postman or browser
> I get fixedlength format.
> Does that mean that I have to implement conversion from fixedlength to json
> in aggregation strategy class, or there is still a way to do it
> somehow in a route builder class?
> The outline of my route is like this:
> from(getDirectRouteId(id))
> .routeId(id)
>         .setBody(simple("original request message"))
> .setHeader("CamelJmsDestinationName",constant("queue://QM_TEST/inputq?targetClient=1"))
> .to(ExchangePattern.InOut,"websphere:queue:SYSTEM.DEFAULT.LOCAL.QUEUE?useMessageIDAsCorrelationID=true&replyTo=REPLYQ")
>         .unmarshal(dataFormat)
>         .split(body(),new AgrStrat()).parallelProcessing()
>         .process(new Processor() {
>             public void process(Exchange exchange) throws Exception {
>             //assemble new mq requests based on the content of splitted
> response mq message
>            }
>         })
> .setHeader("CamelJmsDestinationName",constant("queue://QM_TEST/inputq?targetClient=1"))
> .to(ExchangePattern.InOut,"websphere:queue:SYSTEM.DEFAULT.LOCAL.QUEUE?useMessageIDAsCorrelationID=true&replyTo=REPLYQ")
>         .aggregate(constant(true),new AgrStrat()).completionTimeout(3000)
>         .log("${body}")
>         .unmarshal(dataFormat1)
>         .marshal().json(JsonLibrary.Jackson)
>         .log("${body}");
> AgrStrat basically concatenates the newExchange with the oldExchange,
> inserting "\n" in between, at the moment.
> I guess I should move format conversion there? Thank you.

Zoran Regvart