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. Adding others fireAllRules() and clock updates doesn't change the output. What am I doing wrong? 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(); } The event insertion is done like this: lastEventHandle = (EventFactHandle) eventStream.insert(new InhibitEvent(new GregorianCalendar(2011, Calendar.DECEMBER, 6, 12, 0, 0).getTime())); advanceSessionClock(ksession, lastEventHandle.getStartTimestamp()); lastEventHandle = (EventFactHandle) eventStream.insert(new TriggerEvent(new GregorianCalendar(2011, Calendar.DECEMBER, 6, 13, 0, 0).getTime())); advanceSessionClock(ksession, lastEventHandle.getStartTimestamp()); lastEventHandle = (EventFactHandle) eventStream.insert(new InhibitEvent(new GregorianCalendar(2011, Calendar.DECEMBER, 6, 14, 0, 0).getTime())); advanceSessionClock(ksession, lastEventHandle.getStartTimestamp()); lastEventHandle = (EventFactHandle) eventStream.insert(new TriggerEvent(new GregorianCalendar(2011, Calendar.DECEMBER, 6, 14, 10, 0).getTime())); advanceSessionClock(ksession, lastEventHandle.getStartTimestamp()); lastEventHandle = (EventFactHandle) eventStream.insert(new InhibitEvent(new GregorianCalendar(2011, Calendar.DECEMBER, 6, 14, 20, 0).getTime())); advanceSessionClock(ksession, lastEventHandle.getStartTimestamp()); This works as expected, but the rule is triggered after inserting the event at 13:00:00, so it could also be that drools has already removed the event at 12:00:00 (the 1h window is strict) and it triggers the event, so I have modified the timestamps like this: lastEventHandle = (EventFactHandle) eventStream.insert(new InhibitEvent(new GregorianCalendar(2011, Calendar.DECEMBER, 6, 12, 10, 0).getTime())); advanceSessionClock(ksession, lastEventHandle.getStartTimestamp()); lastEventHandle = (EventFactHandle) eventStream.insert(new TriggerEvent(new GregorianCalendar(2011, Calendar.DECEMBER, 6, 13, 0, 0).getTime())); advanceSessionClock(ksession, lastEventHandle.getStartTimestamp()); lastEventHandle = (EventFactHandle) eventStream.insert(new InhibitEvent(new GregorianCalendar(2011, Calendar.DECEMBER, 6, 13, 50, 0).getTime())); advanceSessionClock(ksession, lastEventHandle.getStartTimestamp()); lastEventHandle = (EventFactHandle) eventStream.insert(new TriggerEvent(new GregorianCalendar(2011, Calendar.DECEMBER, 6, 14, 0, 0).getTime())); advanceSessionClock(ksession, lastEventHandle.getStartTimestamp()); lastEventHandle = (EventFactHandle) eventStream.insert(new InhibitEvent(new GregorianCalendar(2011, Calendar.DECEMBER, 6, 14, 10, 0).getTime())); advanceSessionClock(ksession, lastEventHandle.getStartTimestamp()); The rule should still be triggered, for example considering a 1h window betweeen 12:30:00 and 13:30:00. It is not, even changing the clock update method as follows: private static void advanceSessionClock(StatefulKnowledgeSession ksession, long time) { final SessionPseudoClock pseudoClock = ksession.getSessionClock(); while(pseudoClock.getCurrentTime() < time) { pseudoClock.advanceTime(1, TimeUnit.SECONDS); ksession.fireAllRules(); } ksession.fireAllRules(); } I would like to have a clear and consistent idea of what is happening and why. -- MM -- View this message in context: http://drools.46999.n3.nabble.com/Sliding-window-behavior-in-stream-mode-and-realtime-clock-tp3564950p3566923.html Sent from the Drools: User forum mailing list archive at Nabble.com. _______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users