[ 
https://issues.apache.org/jira/browse/CAMEL-13553?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17261272#comment-17261272
 ] 

Claus Ibsen commented on CAMEL-13553:
-------------------------------------

I have a fix for this. And then I will also look at fixing so if you use global 
scoped onCompletion then its only triggered once per exchange (currently it is 
mistakenly called twice).

The docs is also being cleaned up.

> OnCompletion behaves strange in combination with direct subroutes
> -----------------------------------------------------------------
>
>                 Key: CAMEL-13553
>                 URL: https://issues.apache.org/jira/browse/CAMEL-13553
>             Project: Camel
>          Issue Type: Bug
>          Components: came-core
>    Affects Versions: 2.23.2, 2.24.0, 3.7.0
>            Reporter: Jakob Thun
>            Assignee: Claus Ibsen
>            Priority: Minor
>             Fix For: 3.7.1, 3.8.0
>
>
> There is a strange behaviour in .onCompletion().modeBeforeConsumer() when 
> used in combination with direct sub-routes.
> The route behaves differently depending on where onCompletion is declared. 
> When declared in the top of the route it will execute several times. Once for 
> every route, including the subroutes.
> I have made a small spring-boot sample app where I try to demonstrate this 
> behaviour.
>  [https://github.com/jakobthun/camel-oncompletion-bug]
> This route:
> {code:java}
>     public static final String ORIGINAL_ROUTE_NAME  = 
> "PossibleBug-original-route";
>     public static final String SUBROUTE_NAME        = "PossibleBug-subroute";
>     public static final String DIRECT_ENDPOINT      = "direct:possiblebug";
>     @Override
>     public void configure() throws Exception {
>         from("timer:expected?period=10000&delay=5000")
>                 .routeId(ORIGINAL_ROUTE_NAME)
>                 .onCompletion().modeBeforeConsumer()
>                     .log("This should be done once, when the original route 
> is completed i.e. after log 3. But when onCompletion is defined in top of 
> route AND it is in modeBeforeConsumer() it will also be applied to when the 
> direct-route is completed. So it will be executed twice.")
>                 .end()
>                 .log("1")
>                 .to(DIRECT_ENDPOINT)
>                 .log("3");
>         from(DIRECT_ENDPOINT)
>                 .routeId(SUBROUTE_NAME)
>                 .log("2");
>     }
> {code}
>  Generates the following log:
> {noformat}
> 2019-05-21 14:50:24.545  INFO 138880 --- [imer://expected] 
> PossibleBug-original-route               : 1
> 2019-05-21 14:50:24.545  INFO 138880 --- [imer://expected] 
> PossibleBug-subroute                     : 2
> 2019-05-21 14:50:24.545  INFO 138880 --- [imer://expected] 
> PossibleBug-original-route               : This should be done once, when the 
> original route is completed i.e. after log 3. When onCompletion is defined in 
> top of route it is also applied to the direct-route
> 2019-05-21 14:50:24.545  INFO 138880 --- [imer://expected] 
> PossibleBug-original-route               : 3
> 2019-05-21 14:50:24.545  INFO 138880 --- [imer://expected] 
> PossibleBug-original-route               : This should be done once, when the 
> original route is completed i.e. after log 3. When onCompletion is defined in 
> top of route it is also applied to the direct-route
> {noformat}
>  
> As can be seen above the log message defined in onCompletion shows up twice. 
> If onCompletion is defined in the end of the route this will not be the case. 
> Also when using modeAfterConsumer (or not specifying mode) it will only show 
> up once. See github project to see this example in action.
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to