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 <[email protected]> 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 <[email protected]>
> 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
>