[ 
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

        

Reply via email to