You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Nick Chistyakov <ch...@gmail.com> on 2010/02/10 18:35:17 UTC

onException: cannot get an exception object form exchange properties.

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

Re: onException: cannot get an exception object form exchange properties.

Posted by Claus Ibsen <cl...@gmail.com>.
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 <ch...@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 <cl...@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 <ch...@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

Re: onException: cannot get an exception object form exchange properties.

Posted by Claus Ibsen <cl...@gmail.com>.
See this unit test which works and uses the transferExchange option

https://svn.apache.org/repos/asf/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsDeadLetterQueueUsingTransferExchangeTest.java



On Thu, Feb 11, 2010 at 2:58 PM, Nick Chistyakov <ch...@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 <cl...@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 <ch...@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

Re: onException: cannot get an exception object form exchange properties.

Posted by Nick Chistyakov <ch...@gmail.com>.
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 <cl...@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 <ch...@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
>

Re: onException: cannot get an exception object form exchange properties.

Posted by Claus Ibsen <cl...@gmail.com>.
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 <ch...@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