camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tomohisa Igarashi <tm.igara...@gmail.com>
Subject Re: NotifyBuilder Behaviour
Date Sat, 12 Nov 2016 08:48:25 GMT
It seems I replied too early. I understood the behavior after took a look at testcases.

The conclusion is:
#1. whenExactlyDone() doesn't work for internal routing like to("direct:a") -> from("direct:a"),
as it continues with existing Exchange, therefore ExchangeCompleted event is not produced
for it. Use wereSentTo() instead.
#2. Predicates order does matter. from() should be placed before whenExactlyDone(). whenExactlyDone().from("direct:a")
just equals to whenExactlyDone(). This allows more complex condition like from("direct:a").whenDone(3).and().from("direct:b").whenDone(5)

cf. https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/builder/NotifyBuilder.java

Thanks,
Tomo


On 11/11/2016 08:43 PM, Tomohisa Igarashi wrote:
> Hmm... I took a look at the code but looks confusing to me.
>
> At first, direct:route2 and direct:route3 invocation doesn't produce ExchangeCompleted
event, as DirectProducer doesn't create new Exchange but invoke consumer Processor directly.
> However when from()'s predicate is evaluated in matches(), it always returns true, so
ExchangeCompleted event for the direct:route1 exchange is also counted for route2 and route3.
> https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/builder/NotifyBuilder.java#L126
>
> ExchangeCompleted event increments the count in the predicate added by whenExactlyDone()
here
> https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/builder/NotifyBuilder.java#L568
>
> Second however, if from()'s predicate is put prior to whenExactlyDone(), ExchangeCompleted
event is not delivered to the whenExactlyDone()'s predicate
> https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/builder/NotifyBuilder.java#L1576
>
> That's the reason why #2 and #3 are false.
>
> So, at least whenExactlyDone() doesn't work for internal(direct) routing right now. As
it seems ExchangeSent event is sent for internal routing as well, wereSentTo() would work
for that purpose instead.
>
> According to the comment, that's intended to always return true on matches() in from()'s
predicate, so I'm not exactly sure how it should be. I think ExchangeCompleted event should
be delivered to all the predicates regardless of the previous result though.
>
> Would anyone else help?
>
> Thanks,
> Tomo
>
> On 11/11/2016 01:18 PM, Tomohisa Igarashi wrote:
>> Hi,
>>
>> Hmm this looks weird. The predicates order shouldn't matter. Would you file a JIRA?
>>
>> Thanks,
>> Tomo
>>
>> On 11/10/2016 06:13 PM, sohrab wrote:
>>> I've read the page on NotifyBuilder but I don't think I really understood how
>>> it works. So I wrote below test case to verify it. The results confound me.
>>>
>>> (The Groovy script is standalone and fully functioning so feel free to run
>>> it locally.)
>>>
>>> Code
>>> ===
>>>
>>> @Grab(group='org.apache.camel', module = 'camel-core', version='2.15.1')
>>> import java.util.concurrent.TimeUnit
>>> import org.apache.camel.builder.*
>>> import org.apache.camel.impl.DefaultCamelContext
>>>
>>> def context = new DefaultCamelContext()
>>> context.addRoutes(new RouteBuilder() {
>>>         void configure() {
>>>             from('direct:route1').routeId('route1')
>>>                 .log('route 1 started')
>>>                 .to('direct:route2')
>>>                 .log('route 1 ended')
>>>             from('direct:route2').routeId('route2')
>>>                 .log('route 2 started')
>>>                 .to('direct:route3')
>>>                 .log('route 2 ended')
>>>             from('direct:route3').routeId('route3')
>>>                 .log('route 3 started and ended')
>>>         }
>>>     })
>>> context.start()
>>>
>>> def notifies = [
>>>     new
>>> NotifyBuilder(context).from('direct:route1').whenExactlyDone(1).create(),
>>>     new
>>> NotifyBuilder(context).from('direct:route2').whenExactlyDone(1).create(),
>>>     new
>>> NotifyBuilder(context).from('direct:route3').whenExactlyDone(1).create(),
>>>     new
>>> NotifyBuilder(context).whenExactlyDone(1).from('direct:route1').create(),
>>>     new
>>> NotifyBuilder(context).whenExactlyDone(1).from('direct:route2').create(),
>>>     new
>>> NotifyBuilder(context).whenExactlyDone(1).from('direct:route3').create()
>>> ]
>>> context.createProducerTemplate().requestBody 'direct:route1', 'something'
>>> notifies.eachWithIndex { it, i -> println "$i: ${it.matches()}"  }
>>>
>>>
>>> STDOUT
>>> ===
>>>
>>> 0: true
>>> 1: false
>>> 2: false
>>> 3: true
>>> 4: true
>>> 5: true
>>>
>>>
>>> I understand the predicates are stacked but can someone please explain the
>>> above behaviour to me?
>>>
>>>
>>>
>>> --
>>> View this message in context: http://camel.465427.n5.nabble.com/NotifyBuilder-Behaviour-tp5789988.html
>>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>>

Mime
View raw message