Drools:计时器与持续时间属性

时间:2013-12-06 16:23:18

标签: drools

Drools'documentation表示计时器属性现在优先于持续时间

  

规则现在支持基于区间和基于cron的计时器,它们取代了现在已弃用的持续时间属性。

但我发现这样的规则不起作用:

rule "Expired auth"
    timer(int: 5s)

    when
        $auth   : Authorized()
        $noauth : NotAuthorized()
    then
        retract($auth);
        retract($noauth);
end

因为第一次评估时会删除所有事实,并且不会按预期安排规则。 但我发现 duration 属性的规则可以正常工作:

rule "Expired auth"
    duration(5s)

    ...
end

有没有办法通过 timer 来做到这一点?

2 个答案:

答案 0 :(得分:2)

持续时间映射到间隔计时器,因此它们的工作方式相同。您的问题可能就在其他地方。

见第176行https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/main/java/org/drools/compiler/rule/builder/RuleBuilder.java#L176

答案 1 :(得分:0)

file.drl

rule "address should be in"
   timer(int: 5s 2s) //fire after 5s and will be continue every 2s untill the sleep time out.
   when
      $address: Address(postcode != null)
   then
    System.out.println(hello("rule is fired...."));
end

java代码

// Active Mode
    KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration();
    config.setOption( ClockTypeOption.get("realtime") );
    final KieSession session = kbase.newKieSession( config, null );

    session.setGlobal( "myGlobalList", list);
    new Thread(new Runnable() {
        public void run() {
            session.fireUntilHalt();
        }
    }).start();

    session.insert(address);
    Thread.sleep(30000L);
    System.out.println("end:"+ list);
    session.halt();
    session.dispose();