You most likely need to tell the splitter to use the
UseLatestAggregationStrategy for aggregation if you want it to spit
out the last body,.


On Wed, Oct 13, 2010 at 6:46 PM, ee7arh <[email protected]> wrote:
>
> Hello,
>
> This was originally posted in default Camel forum but I guess camel-users is
> best.
>
> Since we upgraded to anything from Camel 2.3 onwards, our InOut() routes are
> mis-behaving ;)
>
> After some long and painful debugging we realised that the Splitter()
> pattern is causing the problem. The problem is that the Out Exchange does
> not contain the expected body() anymore.
>
> Explanation:
>
> As the Exchange propagates down the inOut() routes, the Body gets
> transformed from 1 type of object to another as we pass it from bean to
> bean. We expect to get back in the synchronous response whatever object is
> in the Body at the end of the inOut route, however that is not the case when
> a splitter is inserted somewhere in the route. Instead, we get back the body
> from the Exchange as it was when it entered the Splitter - so in our case,
> that is an ArrayList (since we are asking the splitter to split our list).
>
> What is interesting is that the Synchronous call is not returned back to the
> caller when the Splitter is reached. Camel correctly continues to process
> the route (and any further routes defined with inOut()) all the way to the
> end before returning to caller. However the Out Exchange does not contain
> the expected body(), instead it contains the body() as it was when it hit
> the first Splitter.
>
>
> TestCase:
>
> The  http://camel.465427.n5.nabble.com/file/n3210842/Handler.java
> Handler.java  file contains route definitions and
> http://camel.465427.n5.nabble.com/file/n3210842/Router.java Router.java
> contains methods that are called from Router. Class Handler is defined as a
> bean in the application spring configuration and referred to as "handler".
>
> Classes A, B, C and D are simple classes without any fields or methods.
>
> After running a jUnit test with the following test method:
>    public void testCamel() {
>
>        A a = new A();
>
>        ProducerTemplate camelTemplate = (ProducerTemplate)
>
> ApplicationContextProvider.getApplicationContext().getBean("camelTemplate");
>
>        Object o = camelTemplate.requestBody("direct:start", a);
>
>        System.out.println("Returned: " + o.getClass().getName());
>
>        if (o instanceof List) {
>
>            for (Object element : (List) o) {
>
>                System.out.println("Element: " +
> element.getClass().getName());
>            }
>        }
>    }
>
> what gets passed back is a List containing objects of type B
> Returned: java.util.ArrayList
> Element: B
> Element: B
> Element: B
>
> even though a single object of type C should have been returned.
>
> Please help. We are making extensive use of this Camel feature so we are
> struggling to work around.
>
> Thanks in advance and BRegards
>
> For ref: Originally posted here:
> http://camel.465427.n5.nabble.com/Synchronous-queue-and-splitter-issue-td3201480.html#a3201480
> --
> View this message in context: 
> http://camel.465427.n5.nabble.com/Problem-with-Splitter-in-Synchronous-routes-introduced-in-Camel-2-3-tp3210842p3210842.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>



-- 
Claus Ibsen
Apache Camel Committer

Author of Camel in Action: http://www.manning.com/ibsen/
Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus

Reply via email to