在一定的时间或事实,执行规则的Drools(Execute Drools rule at certa

2019-10-29 04:35发布

我想一个规则,以便当它是上午8时或太阳升起来了。 如何去这个问题?

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

定时器的作用就像一个先决条件。 所以我想这不是在这种情况下非常有用。

一个额外的时间事实上将不得不第二更新一次,这将导致规则重烧每一秒。 我想我可以的时候其实分成小时分钟的事实,但不会真正解决问题,而只是让它发生较少。

这样的规则可能/可行的Drools的?

Answer 1:

你可以有一个规则,那就是不断跟踪的时间。 那么你的规则可以只检查到时候开火。 我用毫秒简单起见,但我认为你可以看到它如何能适应任何你想要的。 为了解决您的烧制的问题每第二个问题,适应时代的类中使用日历对象或类似的规定。 只是一个时间对象初始化你的知识会话。

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();
     }

}


Answer 2:

所以这是我做的有时间作为一个额外的触发器:

1)创建仅基于一个cron触发器,其在上午08时插入时间基于事实的一个单独的规则。

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;
    }
}


文章来源: Execute Drools rule at certain time or fact