[jboss-jira] [JBoss JIRA] (DROOLS-1130) Using fireAllRules, Timed rules does not cascade rule execution after modifying a fact, event when Session conf is set to TimedRuleExectionOption.YES

Juan Carlos Garcia (JIRA) issues at jboss.org
Mon Apr 18 05:14:00 EDT 2016


Juan Carlos Garcia created DROOLS-1130:
------------------------------------------

             Summary: Using fireAllRules, Timed rules does not cascade rule execution after modifying a fact, event when Session conf is set to TimedRuleExectionOption.YES
                 Key: DROOLS-1130
                 URL: https://issues.jboss.org/browse/DROOLS-1130
             Project: Drools
          Issue Type: Bug
    Affects Versions: 6.3.0.Final
            Reporter: Juan Carlos Garcia
            Assignee: Mark Proctor
         Attachments: timer-rule-bug.zip

I have a DRL file with 2 rules and the first rule has a timer of 3s, after this rule gets fired and modified a fact 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:*
{code}
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
{code}

*java code:*
{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));
    }
{code}



--
This message was sent by Atlassian JIRA
(v6.4.11#64026)


More information about the jboss-jira mailing list