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
