Uploaded image for project: 'Drools'
  1. Drools
  2. DROOLS-1130

Using fireAllRules, Timed rules does not cascade rule execution after modifying a fact, event when Session conf is set to TimedRuleExectionOption.YES

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Won't Do
    • Icon: Major 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));
          }
      

            mfusco@redhat.com Mario Fusco
            jcgarciam_jira Juan Carlos Garcia (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: