-
Bug
-
Resolution: Won't Do
-
Major
-
None
-
6.3.0.Final
-
None
-
None
-
NEW
-
NEW
I have a DRL file with 2 rules and the first rule has a timer of 3s, after this rule gets fired and a fact is modified, i expect a second rule to get activate and trigger but is not happening. Even though the documentation explicitly said in the 2.9.2 section of:
http://docs.jboss.org/drools/release/6.3.0.Final/drools-docs/html/ch02.html#d0e1467
When the rule engine runs in passive mode (i.e.: using fireAllRules) by default it doesn't fire consequences of timed rules unless fireAllRules isn't invoked again. Now it is possible to change this default behavior by configuring the KieSession with a TimedRuleExectionOption
Please advise if i have misunderstood the expected behavior, attached is a demo project enclosing the mentioned rules and a testcase.
DRL:
import java.util.logging.Logger import bug.timedrules.Table rule "table with 1 player" timer( int: 3s) no-loop true when $table : Table( getCounter() == 1) then Logger.getLogger("timer.drl").info("triggered - counter is 1"); modify($table){ setCounter(2) } end rule "Table upgrade to 2 player" no-loop true when $table : Table( getCounter() == 2) then Logger.getLogger("timer.drl").info("triggered - counter is 2"); modify($table){ setCounter(3) } end
java code:
@Test public void executeNewRuleAfterTimedRuleExecution() throws Exception { KieBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); KieSessionConfiguration ksconf = KieServices.Factory.get().newKieSessionConfiguration(); ksconf.setOption(TimedRuleExectionOption.YES); config.setOption(EventProcessingOption.STREAM); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(config); final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource("bug/timer/timer.drl", BugTest.class), ResourceType.DRL); if (kbuilder.hasErrors()) { throw new IllegalStateException(kbuilder.getErrors().toString()); } kbase = KnowledgeBaseFactory.newKnowledgeBase(config); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); final StatefulKnowledgeSession statefulKnowledgeSession = kbase.newStatefulKnowledgeSession(ksconf, null); Table table = new Table(1234, 1); statefulKnowledgeSession.insert(table); statefulKnowledgeSession.fireAllRules(); Thread.sleep(TimeUnit.SECONDS.toMillis(5)); statefulKnowledgeSession.dispose(); Assert.assertThat(table.getCounter(), CoreMatchers.is(3)); }