Hi You can always put the caused exception to a Header as a String. The JMS spec only allows a limited set of types to be used as JMS headers (= JMS properties).
On Thu, Feb 11, 2010 at 2:58 PM, Nick Chistyakov <chiko...@gmail.com> wrote: > 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 >> > -- 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