Hello Claus, transferExchange=true will not work, I tracked it down to Exchange transformation to ActiveMQObjectMessage
ActiveMQSession.java: 1671: msg = (ActiveMQMessage)msg.copy(); ActiveMQMessage.java .... public Message copy() { ActiveMQMessage copy = new ActiveMQMessage(); copy(copy); return copy; } will call: ActiveMQObjectMessage.java private void copy(ActiveMQObjectMessage copy) { storeContent(); super.copy(copy); copy.object = null; } and actually this copy.object is a place where the exception is stored in properties. It will not be copied and that information will be lost. Best regards, Nick On Wed, Feb 10, 2010 at 11:38 PM, Claus Ibsen <claus.ib...@gmail.com> wrote: > JMS only stores body + headers. Any properties and the likes are not > stored. Hence what you move to jms:errors in the Message body. > If you want to store the Exception as well you gotta serialize it and > store it as a header etc. > > You can try the transferExchange=true option on the JMS endpoint, then > Camel will store the entire Exchange including the Exception. > See more at the wiki page > http://camel.apache.org/jms.html > > On Wed, Feb 10, 2010 at 6:35 PM, Nick Chistyakov <chiko...@gmail.com> > wrote: > > Hello camel riders! > > I found a problem on getting an exception object out of exchange. > > If I declare a route like this: > > onException(Exception.class) > > .handled(true) > > .to("jms:errrors"); > > > > Then, I should be able to write a code like this: > > Exchange e = consumer.receive("jms:errrors", 1000); > > and I can access an exception by: > > e.getProperty(Exchange.EXCEPTION_CAUGHT); > > The problem is that there is no exception object (null instead of it) in > > case when I run the system composed of set of modules > > that all have the route above to handle exceptions. > > > > The simple unit test, where everything is one context will pass. But will > > fail in more complicated cases. > > The exchange will contain a message that was not delivered but somehow it > > will miss any information about exception. > > > > If I modify my route :) > > onException(Exception.class) > > .onWhen(new Predicate() { > > @Override > > public boolean matches(Exchange exchange) { > > > exchange.getIn().setBody(exchange.getException()); > > return true; > > } > > }) > > .handled(true) > > .to("jms:errors"); > > I will yet get it (instead of original message body though) > > > > Where can I find a code that finally serializes the exchange and sends it > to > > destination? > > I tried to debug it but I'm not o experienced in camel internals, so I > > didn't find it. > > I would like to track what is going on. > > To make my point 100% clear I provided a small test project. > > It's a maven project so anyone can easily run it. > > It contains a Router and 2 test: > > OnExceptionGreenTest and > > OnExceptionRedTest > > one is passing one is not. > > Best regards, > > Nick > > > > -- > 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 >