在特定时间或事实执行Drools规则

时间:2013-05-30 20:59:01

标签: java time drools rule

我希望在早上8点或太阳升起时开火。如何解决这个问题?

rule X
    when
        ( "it's 8am" and ... and ...)
        or
        (Sun( up ) and ... and ...)
    then
        // do something
end

计时器就像一个先决条件。所以我想在这种情况下它没用。

额外的时间事实必须每秒更新一次,这将导致规则每秒重新启动。我想我可以将时间事实分成小时分钟第二个事实,但那不会真正解决问题,但只是让它不那么经常发生。

这样的规则在Drools中是否可行/可行?

2 个答案:

答案 0 :(得分:1)

你可以有一个不断追踪时间的规则。然后你的规则可以检查那个时间来开火。为简单起见,我使用毫秒,但我认为你可以看到它如何适应你想要的任何东西。要解决每秒问题的触发问题,请调整Time类以使用Calendar对象或沿这些行的某些内容。只需使用Time对象初始化您的知识会话。

rule "update time"
   when
        $time : Time(value != currentTime)
    then
        modify($time){
            setValue($time.getCurrentTime());
        };
end

rule "X"
     when
        Time(value = //whatever time)
     then
     // do something
end


public class Time
{
     long value;

     public Time()
     {
          value = getCurrentTime();
     }

     //getter and setter for value

     public long getCurrentTime()
     {
          return System.currentTimeMilliSeconds();
     }

}

答案 1 :(得分:1)

所以我这样做就是把时间作为额外的触发器:

1)仅基于cron触发器创建单独的规则,该触发器在上午8点插入时间事实。

2)对cron触发的时间事实进行实际规则检查。

rule "08:00 AM"
    timer( cron: 0 0 8 * * ? )
    when // empty
    then
        insertLogical( new Time(31) ); // 31 is a rule ID, see below
end

rule "X"
    when
        Time( ruleID == 31 )
        or
        Sun( up )
    then
        // do something
end

insertLogical将一个事实插入内存,并在不再需要时将其删除。这是时间的事实:

public class Time {
    private int ruleID;

    public Time( int ruleID ) {
        this.ruleID = ruleID;
    }

    public getRuleID() {
        return this.ruleID;
    }
}