[rules-users] Sliding window behavior in stream mode and realtime clock

Wolfgang Laun wolfgang.laun at gmail.com
Wed Dec 7 05:08:13 EST 2011


See below.

On 07/12/2011, MarcoMojana <marco.mojana at exmachina.ch> wrote:
> I have set the session clock type to pseudo, the processing mode is still
> stream and I have added the following rule:
>
> rule "SingleEvent"
> 	dialect "mvel"
> 	when
> 		$e0 : TriggerEvent() over window:time(1h) from entry-point EventStream
> 	then
> 		System.err.println("SingleEvent " + $e0);
> end
>
> And I have changed the code in the following way:
>
> eventStream.insert(new InhibitEvent(new GregorianCalendar(2011,
> Calendar.DECEMBER, 6, 12,  0, 0).getTime()));
> eventStream.insert(new TriggerEvent(new GregorianCalendar(2011,
> Calendar.DECEMBER, 6, 13,  0, 0).getTime()));
> eventStream.insert(new InhibitEvent(new GregorianCalendar(2011,
> Calendar.DECEMBER, 6, 14,  0, 0).getTime()));
> eventStream.insert(new TriggerEvent(new GregorianCalendar(2011,
> Calendar.DECEMBER, 6, 14, 10, 0).getTime()));
> EventFactHandle lastEventHandle = (EventFactHandle) eventStream.insert(new
> InhibitEvent(new GregorianCalendar(2011, Calendar.DECEMBER, 6, 14, 20,
> 0).getTime()));
>
> System.err.println("The session clock is set to: " + new
> Date(pseudoClock.getCurrentTime()));
> ksession.fireAllRules();
> System.err.println("The session clock is set to: " + new
> Date(pseudoClock.getCurrentTime()));
>
> It prints:
>
> The session clock is set to: Thu Jan 01 01:00:00 CET 1970
> SingleEvent TriggerEvent [timestamp=Tue Dec 06 14:10:00 CET 2011]
> SingleEvent TriggerEvent [timestamp=Tue Dec 06 13:00:00 CET 2011]
> The session clock is set to: Thu Jan 01 01:00:00 CET 1970
>
> This means that, with a pseudo clock, even if you don't update it,
> drools will consider also the events happening after it (The events are
> inserted in the entry-point, not as facts). In my opinion this doesn't
> make any sense.

With the pseudo clock set to the begin of the epoch you run Drools as
if we had 1970. Drools refuses to believe that it is fed events that are
in the future; asking it to locate events that have happened not earlier
than one hour ago includes those with a timestamp that is in the future.


>
> Adding others fireAllRules() and clock updates doesn't change the output.
> What am I doing wrong?

Do you really set the pseudo clock to the values in the timestamps?
  set the clock
  insert the event
  fire all rules


>
> Now I would like to trigger also the "EventNotInhibited" rule. I have
> defined a method that updates the session clock in one big step:
>
> private static void advanceSessionClock(StatefulKnowledgeSession ksession,
> long time) {
> 		
> 	final SessionPseudoClock pseudoClock = ksession.getSessionClock();
> 	
> 	final long advance = time - pseudoClock.getCurrentTime();
> 	if(advance > 0)
> 		pseudoClock.advanceTime(advance, TimeUnit.MILLISECONDS);
> 	ksession.fireAllRules();
> 	

I would not call fireAllRules here - see the pseudo-code above. The arrival
of an event with timestamp T should happen when the clock points at T.

-W



More information about the rules-users mailing list