1

我正在尝试在 Drool Fusion(版本 5.4.1)中运行以下规则,但它不起作用。

理想情况下,它应该每 7 秒打印一次“HELLO WORLD”,甚至不会触发一次。

有人可以帮我理解 Drools 中的计时器吗?

     import com.drools.message.Message

rule "Test" 
    timer(int: 7s 7s)
when
    message:Message (type=="Hello")
then
    System.out.println("Hello World, Drools! " + message.getMsgtext());
end
   My code to run the above Rule is:
public class TestDrools {

  private static String DRL_FILE = "test_drools.drl";
  private static KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
          .newKnowledgeBuilder();
  private static Collection pkgs;
  private static KnowledgeBase kbase = KnowledgeBaseFactory
          .newKnowledgeBase();
  private static StatefulKnowledgeSession ksession;

  private static WorkingMemoryEntryPoint entryPoint;

  public static void main(String[] args) {
      init();
      while (true) {
          Message msg = new Message();
          msg.setType("Hello");
          msg.setMsgtext("1");
          ksession.insert(msg);
      }
  }

  private static void init() {
      initialiseDrools();
  }

  private static void initialiseDrools() {
      kbuilder.add(ResourceFactory.newClassPathResource(DRL_FILE),
              ResourceType.DRL);
      if (kbuilder.hasErrors()) {
          System.out.println(kbuilder.getErrors().toString());
          throw new RuntimeException("Unable to compile drl\".");
      }
      pkgs = kbuilder.getKnowledgePackages();
      KnowledgeBaseConfiguration config = KnowledgeBaseFactory
              .newKnowledgeBaseConfiguration();
      config.setOption(EventProcessingOption.STREAM);
      kbase = KnowledgeBaseFactory.newKnowledgeBase(config);
      kbase.addKnowledgePackages(pkgs);
      KnowledgeSessionConfiguration conf = KnowledgeBaseFactory
              .newKnowledgeSessionConfiguration();
      conf.setOption(ClockTypeOption.get("pseudo"));
      ksession = kbase.newStatefulKnowledgeSession(conf, null);
      entryPoint = ksession.getWorkingMemoryEntryPoint("entryone");
      new Thread() {
          @Override
          public void run() {
              ksession.fireUntilHalt();
          }
      }.start();
  }
}

谢谢-桑杰

4

2 回答 2

1

根据@laune 的评论,您使用了pseudo clock. 如果要使用realtime时钟,请更改以下行:

  conf.setOption(ClockTypeOption.get("realtime"));

或者干脆完全删除线 -realtime是默认时钟。

如果你想使用伪时钟,你需要自己推进它。这通常用于单元测试,例如

  SessionPseudoClock  clock = ksession.getSessionClock();
  // insert some facts ... 
  clock.advanceTime(1, TimeUnit.HOURS);
  ksession().fireAllRules();

  // Do your unit test asserts / verify mocks here to verify that 
  // time-reasoned rules were / weren't fired
于 2014-01-08T16:09:33.927 回答
0

then条件在条件满足时发生when,因此您至少需要放入eval(true)when condition触发插入knowledgeSession,以便规则引擎弄清楚当某些条件满足时要做什么。

于 2014-01-06T06:36:08.317 回答