0

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

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

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

必须每秒更新一个额外的时间事实,这将导致规则每秒重新触发。我想我可以将时间事实拆分为小时分钟事实,但这并不能真正解决问题,只会减少它的发生频率。

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

4

2 回答 2

2

你可以有一个不断跟踪时间的规则。然后你的规则可以检查那个时间触发。为了简单起见,我使用了毫秒,但我认为您可以看到它如何适应您想要的任何东西。为了解决你的触发问题,请调整 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();
     }

}
于 2013-05-30T21:52:25.210 回答
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;
    }
}
于 2013-06-01T19:53:37.587 回答