Пример #1
0
  @Test
  @Ignore
  public void testReuseAgendaAfterException() throws Exception {
    // JBRULES-3677

    String str =
        "import org.drools.Person;\n"
            + "global java.util.List results;"
            + "rule R1\n"
            + "ruleflow-group \"test\"\n"
            + "when\n"
            + "   Person( $age : age ) \n"
            + "then\n"
            + "   if ($age > 40) throw new RuntimeException(\"Too old\");\n"
            + "   results.add(\"OK\");"
            + "end";

    KnowledgeBase kbase = loadKnowledgeBaseFromString(str);
    final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

    List<String> res = new ArrayList<String>();
    ksession.setGlobal("results", res);

    AgendaEventListener agendaEventListener =
        new AgendaEventListener() {
          public void matchCreated(org.kie.event.rule.MatchCreatedEvent event) {}

          public void matchCancelled(org.kie.event.rule.MatchCancelledEvent event) {}

          public void beforeMatchFired(org.kie.event.rule.BeforeMatchFiredEvent event) {}

          public void afterMatchFired(org.kie.event.rule.AfterMatchFiredEvent event) {}

          public void agendaGroupPopped(org.kie.event.rule.AgendaGroupPoppedEvent event) {}

          public void agendaGroupPushed(org.kie.event.rule.AgendaGroupPushedEvent event) {}

          public void beforeRuleFlowGroupActivated(
              org.kie.event.rule.RuleFlowGroupActivatedEvent event) {}

          public void afterRuleFlowGroupActivated(
              org.kie.event.rule.RuleFlowGroupActivatedEvent event) {
            ksession.fireAllRules();
          }

          public void beforeRuleFlowGroupDeactivated(
              org.kie.event.rule.RuleFlowGroupDeactivatedEvent event) {}

          public void afterRuleFlowGroupDeactivated(
              org.kie.event.rule.RuleFlowGroupDeactivatedEvent event) {}
        };

    ksession.addEventListener(agendaEventListener);

    FactHandle fact1 = ksession.insert(new Person("Mario", 38));
    ((AgendaImpl) ksession.getAgenda()).activateRuleFlowGroup("test");

    assertEquals(1, res.size());
    res.clear();

    ksession.retract(fact1);

    FactHandle fact2 = ksession.insert(new Person("Mario", 48));
    try {
      ((AgendaImpl) ksession.getAgenda()).activateRuleFlowGroup("test");
      fail("should throw an Exception");
    } catch (Exception e) {
    }
    ksession.retract(fact2);

    assertEquals(0, res.size());

    // try to reuse the ksession after the Exception
    FactHandle fact3 = ksession.insert(new Person("Mario", 38));
    ((AgendaImpl) ksession.getAgenda()).activateRuleFlowGroup("test");
    assertEquals(1, res.size());
    ksession.retract(fact3);

    ksession.dispose();
  }