[rules-users] Temporal rule doesn't fire in STREAM mode

Wolfgang Laun wolfgang.laun at gmail.com
Mon Jul 25 09:20:55 EDT 2011


Inline.

2011/7/25 Melton, Michael P CTR SPAWARSYSCEN-ATLANTIC, 01200 <
michael.melton.ctr at navy.mil>

> # If two WorkerInWorkEvents exist for a worker, there must be a
> WorkerOutOfWorkEvent between them
> rule "ERROR: Consecutive WorkerInWorkEvents"
>         when
>                 $w1 : WorkerInWorkEvent( $workerId : workerId )
>                 $w2 : WorkerInWorkEvent( workerId == $workerId, this after
> $w1 )
>                 not WorkerOutOfWorkEvent( workerId == $workerId, this after
> $w1, this before $w2 )
>         then
>                 errors.add("Two WorkerInWorkEvents without a
> WorkerOutOfWorkEvent in between (" + $w2 + ")");
>                 retract( $w2 );
> end
>
I'd say that "this after $w1" makes the Engine wait for ever since after is
not bounded. That the truth of $w2 after $w1 is established before the not
needs to be evaluated and that this, in combination with "this before $w2"
effectually limits the waiting as soon as the second CE is matched is
something that would need symbolic expression interpretation - something
that's not so easy to  program.

Feel free to raise a JIRA if you think otherwise.

However, temporal reasoning with several "flank" events is tricky. My advice
would be to try retain at most one of each kind in WM, and combine them into
a WorkerWorking event with a duration as soon as possible. Then
   - a WorkerOutOfWorkEvent without a matching WorkerInWorkEvent is an error
and retracts it
   - a WorkerOutOfWorkEvent with a matching WorkerInWorkEvent creates a
WorkerWorking event and retracts both
   - a WorkerInWorkEvent during a WorkerWorking is an error etc.
   - (etc)

-W


> I could see via the log that this file was activating, however it was never
> firing.  The retraction of $w2 should have cancelled other rules'
> activations, but it wasn't doing so because this rule was never firing.  I
> just discovered a thread (
> http://drools.46999.n3.nabble.com/Drools-fusion-and-absence-of-events-td51125.html)
> which finally explained to me the reason why:  I was running in STREAM mode,
> and the engine was waiting to see if a WorkerOutOfWorkEvent timestamped
> between the two WorkerInWorkEvents was going to show up.  When I switched to
> CLOUD mode, the rule fired as expected and my other activations were
> cancelled as I expected.
>
> Now, my new question is:  Since I have not specified any intervals, how
> long will the engine wait for the WorkerOutOfWorkEvent to show up?  Forever?
>
>
> Thanks in advance for any light you can shed on this.
>
> Mike
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20110725/10a715a4/attachment.html 


More information about the rules-users mailing list