You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Radoslaw Szymanek (Updated) (JIRA)" <ji...@apache.org> on 2012/04/10 13:55:17 UTC

[jira] [Updated] (CAMEL-5156) simple language is not working in onException policy (for example retryWhile clause).

     [ https://issues.apache.org/jira/browse/CAMEL-5156?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Radoslaw Szymanek updated CAMEL-5156:
-------------------------------------

          Description: 
The bug was checked against 2.9.1 version of Camel. 

The simple language expressions are not calculated properly within onException clause. 

The route below only works as expected because I copy the the exchange and remove information about the exception. If the original exchange with exception information is used with simple language then the exception will be rethrown during (at the end?) the calculation of simple expression. 
If I copy the exchange and remove the exception information then the unit tests are passing nicely and the file with proper content is created, so simple language expression can be calculated properly for the object being routed.

{code}
from("direct:toPropertyFileAvoidFixingUnfixable")
            .onException(NullPointerException.class)
            .onRedelivery(new NullRegistrationDateProcessor())
            .handled(true)
            .retryWhile(new Predicate() {
                public boolean matches(Exchange exchange) {

                    Predicate composite = PredicateBuilder.and(PredicateBuilder.isNull(simple("${body?.getRegistrationDate}")),
                            PredicateBuilder.isNotNull(simple("${body?.getBirthdate}")));

                    // Exchange with exception will make computation of simple predicate fail.
                    Exchange local = exchange.copy();
                    local.setException(null);

                    boolean result = composite.matches(local);

                    return result;

                }
            })
            .end()
            .setHeader(Exchange.FILE_NAME, simple("${body.firstname}.${body.surname}"))
            .bean(RegistrationToPropertiesBean.class, "convert")
            .to("file://" + outFolder);
{code}

It is related to the issue https://issues.apache.org/jira/browse/CAMEL-4513. My guess is that the problem is present for many other places where simple language can be used within onException part of the route definition. Not just retryWhile and custom predicate used within retryWhile. 


  was:
The bug occured in the 2.6.0 version of Camel I'm using. I haven't test it against the latest version but I've checked the sources and it doesn't seem to have change since.

Given a camel route, with a onException clause like this :

{code}
this.onException(MyException.class)
    .onWhen(simple("${exception.myExceptionInfo.aValue} == true"))
    ...
{code}

MyException is a customed exception like this :

{code:title=MyException.java}
public class MyException extends Exception {
   ....
   public MyExceptionInfo getMyExceptionInfo() {
     ...
   }
}
{code}

What I've observed is that when BeanExpression.OgnlInvokeProcessor.process iterate through the methods to calls, it does :
{code}
                // only invoke if we have a method name to use to invoke
                if (methodName != null) {
                    InvokeProcessor invoke = new InvokeProcessor(holder, methodName);
                    invoke.process(resultExchange);

                    // check for exception and rethrow if we failed
                    if (resultExchange.getException() != null) {
                        throw new RuntimeBeanExpressionException(exchange, beanName, methodName, resultExchange.getException());
                    }

                    result = invoke.getResult();
                }
{code}

It successfully invoke the method : invoke.process(resultExchange);
But it checks for exception in the exchange. Since we are in an exception clause, there is an actual exception (thrown by the application, but unrelated with the expression language search) and it fails

There is a simple workaround for that : writing his own predicate class to test wanted conditions

             Priority: Major  (was: Minor)
    Affects Version/s: 2.9.1
        Fix Version/s:     (was: 2.8.3)
                           (was: 2.9.0)
    
> simple language is not working in onException policy (for example retryWhile clause).
> -------------------------------------------------------------------------------------
>
>                 Key: CAMEL-5156
>                 URL: https://issues.apache.org/jira/browse/CAMEL-5156
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>    Affects Versions: 2.9.1
>            Reporter: Radoslaw Szymanek
>            Assignee: Claus Ibsen
>
> The bug was checked against 2.9.1 version of Camel. 
> The simple language expressions are not calculated properly within onException clause. 
> The route below only works as expected because I copy the the exchange and remove information about the exception. If the original exchange with exception information is used with simple language then the exception will be rethrown during (at the end?) the calculation of simple expression. 
> If I copy the exchange and remove the exception information then the unit tests are passing nicely and the file with proper content is created, so simple language expression can be calculated properly for the object being routed.
> {code}
> from("direct:toPropertyFileAvoidFixingUnfixable")
>             .onException(NullPointerException.class)
>             .onRedelivery(new NullRegistrationDateProcessor())
>             .handled(true)
>             .retryWhile(new Predicate() {
>                 public boolean matches(Exchange exchange) {
>                     Predicate composite = PredicateBuilder.and(PredicateBuilder.isNull(simple("${body?.getRegistrationDate}")),
>                             PredicateBuilder.isNotNull(simple("${body?.getBirthdate}")));
>                     // Exchange with exception will make computation of simple predicate fail.
>                     Exchange local = exchange.copy();
>                     local.setException(null);
>                     boolean result = composite.matches(local);
>                     return result;
>                 }
>             })
>             .end()
>             .setHeader(Exchange.FILE_NAME, simple("${body.firstname}.${body.surname}"))
>             .bean(RegistrationToPropertiesBean.class, "convert")
>             .to("file://" + outFolder);
> {code}
> It is related to the issue https://issues.apache.org/jira/browse/CAMEL-4513. My guess is that the problem is present for many other places where simple language can be used within onException part of the route definition. Not just retryWhile and custom predicate used within retryWhile. 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira