我希望在早上8点或太阳升起时开火。如何解决这个问题?
rule X
when
( "it's 8am" and ... and ...)
or
(Sun( up ) and ... and ...)
then
// do something
end
计时器就像一个先决条件。所以我想在这种情况下它没用。
额外的时间事实必须每秒更新一次,这将导致规则每秒重新启动。我想我可以将时间事实分成小时,分钟和第二个事实,但那不会真正解决问题,但只是让它不那么经常发生。
这样的规则在Drools中是否可行/可行?
答案 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;
}
}