use of org.drools.core.time.impl.PseudoClockScheduler in project drools by kiegroup.
the class TimerAndCalendarTest method testExprIntervalTimerRaceCondition.
@Test(timeout = 10000)
public void testExprIntervalTimerRaceCondition() throws Exception {
String str = "";
str += "package org.simple \n";
str += "global java.util.List list \n";
str += "rule xxx \n";
str += " timer (expr: $i, $i) \n";
str += "when \n";
str += " $i : Long() \n";
str += "then \n";
str += " list.add(\"fired\"); \n";
str += "end \n";
KieSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
conf.setOption(ClockTypeOption.get("pseudo"));
KieBase kbase = loadKnowledgeBaseFromString(str);
KieSession ksession = createKnowledgeSession(kbase, conf);
List list = new ArrayList();
PseudoClockScheduler timeService = (PseudoClockScheduler) ksession.<SessionClock>getSessionClock();
timeService.advanceTime(new Date().getTime(), TimeUnit.MILLISECONDS);
ksession.setGlobal("list", list);
FactHandle fh = (FactHandle) ksession.insert(10000l);
ksession.fireAllRules();
assertEquals(0, list.size());
timeService.advanceTime(10, TimeUnit.SECONDS);
ksession.fireAllRules();
assertEquals(1, list.size());
timeService.advanceTime(17, TimeUnit.SECONDS);
ksession.update(fh, 5000l);
ksession.fireAllRules();
assertEquals(2, list.size());
}
use of org.drools.core.time.impl.PseudoClockScheduler in project drools by kiegroup.
the class TimerAndCalendarTest method testCalendarsWithCron.
@Test(timeout = 10000)
public void testCalendarsWithCron() throws Exception {
String str = "";
str += "package org.simple \n";
str += "global java.util.List list \n";
str += "rule xxx \n";
str += " calendars \"cal1\", \"cal2\"\n";
str += " timer (cron:15 * * * * ?) ";
str += "when \n";
str += "then \n";
str += " list.add(\"fired\"); \n";
str += "end \n";
KieSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
conf.setOption(ClockTypeOption.get("pseudo"));
KieBase kbase = loadKnowledgeBaseFromString(str);
KieSession ksession = createKnowledgeSession(kbase, conf);
List list = new ArrayList();
PseudoClockScheduler timeService = (PseudoClockScheduler) ksession.<SessionClock>getSessionClock();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Date date = df.parse("2009-01-01T00:00:00.000-0000");
timeService.advanceTime(date.getTime(), TimeUnit.MILLISECONDS);
final Date date1 = new Date(date.getTime() + (15 * 1000));
final Date date2 = new Date(date1.getTime() + (60 * 1000));
final Date date3 = new Date(date2.getTime() + (60 * 1000));
final Date date4 = new Date(date3.getTime() + (60 * 1000));
Calendar cal1 = new Calendar() {
public boolean isTimeIncluded(long timestamp) {
if (timestamp == date1.getTime()) {
return true;
} else if (timestamp == date4.getTime()) {
return false;
} else {
return true;
}
}
};
Calendar cal2 = new Calendar() {
public boolean isTimeIncluded(long timestamp) {
if (timestamp == date2.getTime()) {
return false;
} else if (timestamp == date3.getTime()) {
return true;
} else {
return true;
}
}
};
ksession.getCalendars().set("cal1", cal1);
ksession.getCalendars().set("cal2", cal2);
ksession.setGlobal("list", list);
ksession.fireAllRules();
timeService.advanceTime(20, TimeUnit.SECONDS);
ksession.fireAllRules();
assertEquals(1, list.size());
timeService.advanceTime(60, TimeUnit.SECONDS);
ksession.fireAllRules();
assertEquals(1, list.size());
timeService.advanceTime(60, TimeUnit.SECONDS);
ksession.fireAllRules();
assertEquals(2, list.size());
timeService.advanceTime(60, TimeUnit.SECONDS);
ksession.fireAllRules();
assertEquals(2, list.size());
timeService.advanceTime(60, TimeUnit.SECONDS);
ksession.fireAllRules();
assertEquals(3, list.size());
timeService.advanceTime(60, TimeUnit.SECONDS);
ksession.fireAllRules();
assertEquals(4, list.size());
}
use of org.drools.core.time.impl.PseudoClockScheduler in project drools by kiegroup.
the class MarshallingTest method testMarshallEntryPointsWithNot.
@Test
public void testMarshallEntryPointsWithNot() throws Exception {
String str = "package org.domain.test \n" + "import " + getClass().getCanonicalName() + ".*\n" + "global java.util.List list\n" + "declare A\n" + " @role( event )\n" + " @expires( 10m )\n" + "end\n" + "declare B\n" + "" + " @role( event )\n" + " @expires( 10m )\n" + "end\n" + "" + "rule a1\n" + "when\n" + " $a : A() from entry-point 'a-ep'\n" + " not B( this after[0s, 10s] $a) from entry-point 'a-ep'\n" + "then\n" + "list.add( $a );" + "end\n";
KieBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
config.setOption(EventProcessingOption.STREAM);
KieBase kBase = loadKnowledgeBaseFromString(config, str);
KieSessionConfiguration ksconf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
ksconf.setOption(ClockTypeOption.get("pseudo"));
ksconf.setOption(TimerJobFactoryOption.get("trackable"));
KieSession ksession = kBase.newKieSession(ksconf, null);
List list = new ArrayList();
ksession.setGlobal("list", list);
EntryPoint aep = ksession.getEntryPoint("a-ep");
aep.insert(new A());
ksession = marsallStatefulKnowledgeSession(ksession);
PseudoClockScheduler timeService = (PseudoClockScheduler) ksession.<SessionClock>getSessionClock();
timeService.advanceTime(3, TimeUnit.SECONDS);
ksession = marsallStatefulKnowledgeSession(ksession);
ksession.fireAllRules();
ksession = marsallStatefulKnowledgeSession(ksession);
assertEquals(0, list.size());
}
use of org.drools.core.time.impl.PseudoClockScheduler in project drools by kiegroup.
the class ExpirationTest method testSoftExpirationWithDeclaration.
@Test
public void testSoftExpirationWithDeclaration() {
// DROOLS-1483
String drl = "import " + A.class.getCanonicalName() + "\n" + "import " + B.class.getCanonicalName() + "\n" + "import " + C.class.getCanonicalName() + "\n" + "declare A @role( event ) @expires(10s) end\n" + "declare B @role( event ) @expires(value = 30s, policy = TIME_SOFT) end\n" + "declare C @role( event ) @expires(value = 30s, policy = TIME_SOFT) end\n" + "rule Ra when\n" + " $e : A() over window:time(20s)\n" + "then end\n " + "rule Rb when\n" + " $e : B() over window:time(20s)\n" + "then end\n " + "rule Rc when\n" + " $e : C()\n" + "then end\n";
KieSessionConfiguration sessionConfig = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
sessionConfig.setOption(ClockTypeOption.get(ClockType.PSEUDO_CLOCK.getId()));
KieHelper helper = new KieHelper();
helper.addContent(drl, ResourceType.DRL);
KieBase kbase = helper.build(EventProcessingOption.STREAM);
KieSession ksession = kbase.newKieSession(sessionConfig, null);
PseudoClockScheduler clock = ksession.getSessionClock();
ksession.insert(new A(1));
ksession.insert(new B(2));
ksession.insert(new C(3));
ksession.fireAllRules();
clock.advanceTime(5, TimeUnit.SECONDS);
ksession.fireAllRules();
assertEquals(1, ksession.getObjects(new ClassObjectFilter(A.class)).size());
assertEquals(1, ksession.getObjects(new ClassObjectFilter(B.class)).size());
assertEquals(1, ksession.getObjects(new ClassObjectFilter(C.class)).size());
clock.advanceTime(10, TimeUnit.SECONDS);
ksession.fireAllRules();
// t=15 -> hard expiration of A
assertEquals(0, ksession.getObjects(new ClassObjectFilter(A.class)).size());
assertEquals(1, ksession.getObjects(new ClassObjectFilter(B.class)).size());
assertEquals(1, ksession.getObjects(new ClassObjectFilter(C.class)).size());
clock.advanceTime(10, TimeUnit.SECONDS);
ksession.fireAllRules();
// t=25 -> implicit expiration of B
assertEquals(0, ksession.getObjects(new ClassObjectFilter(A.class)).size());
assertEquals(0, ksession.getObjects(new ClassObjectFilter(B.class)).size());
assertEquals(1, ksession.getObjects(new ClassObjectFilter(C.class)).size());
clock.advanceTime(10, TimeUnit.SECONDS);
ksession.fireAllRules();
// t=35 -> soft expiration of C
assertEquals(0, ksession.getObjects(new ClassObjectFilter(A.class)).size());
assertEquals(0, ksession.getObjects(new ClassObjectFilter(B.class)).size());
assertEquals(0, ksession.getObjects(new ClassObjectFilter(C.class)).size());
}
use of org.drools.core.time.impl.PseudoClockScheduler in project drools by kiegroup.
the class ExpirationTest method testEventsExpiredInThePast.
private void testEventsExpiredInThePast(final String drl) {
final KieSessionConfiguration sessionConfig = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
sessionConfig.setOption(ClockTypeOption.get(ClockType.PSEUDO_CLOCK.getId()));
final KieHelper helper = new KieHelper();
helper.addContent(drl, ResourceType.DRL);
final KieBase kieBase = helper.build(EventProcessingOption.STREAM);
final KieSession kieSession = kieBase.newKieSession(sessionConfig, null);
PseudoClockScheduler clock = kieSession.getSessionClock();
final long currentTime = clock.getCurrentTime();
clock.advanceTime(100, TimeUnit.MILLISECONDS);
kieSession.insert(new BasicEvent(new Date(currentTime + 20), 10L, "20ms-30ms"));
clock.advanceTime(1, TimeUnit.MILLISECONDS);
kieSession.insert(new BasicEvent(new Date(currentTime + 20), 20L, "20ms-40ms"));
clock.advanceTime(100, TimeUnit.MILLISECONDS);
Assertions.assertThat(kieSession.fireAllRules()).isEqualTo(1);
clock.advanceTime(10, TimeUnit.MILLISECONDS);
Assertions.assertThat(kieSession.getObjects()).isEmpty();
}
Aggregations