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
>

Reply via email to