I have meant to circle back to this but haven't found time before on a
good friday :)

Actually we should divide the onCompletions into 2 categories
- internal
- end user

The internal are used by Camel itself, for example the idempotent
consumer EIP uses it to execute logic when the exchange is done.
Likewise the file component uses it to do commit/rollback logic. And
so forth. The internal *must* only trigger when the exchange is
actually done.

The onCompletion in the route DSL is of course the end user category.

We are having this discussion because the end user onCompletion can be
defined on a per route scope.
So what should happen with that onCompletion if the exchange is not
done at that given route?

Should it do as now, only trigger when the exchange is done,
regardless at which route the exchange is done?
Or should it be scoped so it only trigger, if the exchange is actually
done at the route it was defined?
Or should we add an option to allow the end user to specify that?







On Tue, Jan 18, 2011 at 4:00 AM, Hadrian Zbarcea <[email protected]> wrote:
> The two scenarios are actually identical. The routes should be treated 
> totally independent. One could use all kinds of protocols between the two 
> routes and things should still not change.
>
> scenario N
> =========
> from bar:A
>  onCompletion -> "mock:a" end
>  to XXX
>  to foo:b
> -- optional --
>  to WWW
>  to ZZZ
>
> from foo:b
>  onCompletion -> "mock:b" end
>  to YYY
>
> Exchange transferred or not, the first that triggers is mock:b regardless if 
> the Exchange flowing on route B originated from route A or another route or 
> another client. Once route A completes, regardless if there were other 
> processors after "to foo:b" and regardless if one processor on the route 
> happened to be a SendProcessor on a seda: endpoint, or not, the second on 
> complete should take place on mock:a. The second onComplete must also trigger 
> in the context of route A (meaning that the fromEndpoint on the Exchange 
> should also point to bar:A)
>
> Which is I believe what happens now. From your analysis Claus, if I 
> understand correctly, this is not exactly the case for the seda component, in 
> which case we should fix it there. I don't see a need for an atThisRouteOnly 
> option.
>
> Cheers,
> Hadrian
>
> On Jan 17, 2011, at 5:53 AM, Claus Ibsen wrote:
>
>> Hi
>>
>> In Camel we have on completions
>> http://camel.apache.org/oncompletion.html
>>
>> Which support 2 scope levels: context or route.
>>
>> There is a rules of thumb currently:
>> - If you define a route scope it overrides all global scoped. So its
>> either or (not both).
>>
>> The issue I would like to discuss is this scenario:
>> - If you route an exchange using multiple routes, eg send the exchange
>> using direct/seda to another route with route scoped onCompletion
>>
>>
>> Then this end user came up with this scenario
>> http://camel.465427.n5.nabble.com/error-handling-and-transaction-question-tp3341490p3341490.html
>>
>>
>>
>> scenario 1
>> =========
>> from direct:A
>>   onCompletion -> "mock:a" end
>>   to XXX
>>   to direct:b
>>
>> from direct:b
>>   onCompletion -> "mock:b" end
>>   to YYY
>>
>> In this example the exchange is routed from A -> B using direct, which
>> means that after route B the the Exchange will continue at route A,
>> but there are no more outputs in the route so its done.
>>
>> What onCompletions would you expect to trigger?
>>
>> a) only "mock:a" because the Exchange is done at route A
>> b) both "mock:a" and "mock:b because the Exchange is done (regardless
>> in which route)
>>
>> Currently its b what's implemented in Camel 2.5
>>
>>
>> Now the scenario changes a bit as we use seda endpoints
>>
>> Scenario 2
>> ========
>>
>>
>> from direct:A
>>   onCompletion -> "mock:a" end
>>   to XXX
>>   to seda:b
>>
>> from seda:b
>>   onCompletion -> "mock:b" end
>>   to YYY
>>
>> In this example the exchange is routed from A -> B using seda, which
>> means the exchange is transferred from A -> B and the on completions
>> will be handed over.
>> So when the exchange reaches the end of route B its done (it doesnt
>> continue routing in route A).
>>
>> What onCompletions would you expect to trigger?
>>
>> a) only "mock:b" because the Exchange is done at route B
>> b) both "mock:a" and "mock:b because the Exchange is done (regardless
>> in which route)
>>
>> Currently its b what's implemented in Camel 2.5
>>
>>
>> The issues
>> ========
>>
>> 1)
>> Should we change the default behavior to let Camel trigger route
>> scoped on completions *only* if the exchange is done at that given
>> route?
>>
>> 2)
>> Or should we leave it as is?
>>
>> 3)
>> Or add a new option to route scoped onCompletion so end user can
>> decide? (atThisRouteOnly) = the new option (find a better name for it)
>>
>>   onCompletion atThisRouteOnly -> "mock:a" end
>>
>> And if so, what should the default option for it be?
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> FuseSource
>> Email: [email protected]
>> Web: http://fusesource.com
>> Twitter: davsclaus
>> Blog: http://davsclaus.blogspot.com/
>> Author of Camel in Action: http://www.manning.com/ibsen/
>
>



-- 
Claus Ibsen
-----------------
FuseSource
Email: [email protected]
Web: http://fusesource.com
Twitter: davsclaus
Blog: http://davsclaus.blogspot.com/
Author of Camel in Action: http://www.manning.com/ibsen/

Reply via email to