我有一个场景,我想将规则纯粹用作调用其他服务的预定作业。我在this上使用类似于答案2的解决方案。所以我有规则1看起来像:
rule "ServiceCheck"
timer ( int: 3m 5m )
no-loop true
when
then
boolean isServiceEnabled = DummyServices.getServiceEnabledProperty();
if(isServiceEnabled){
ServicesCheck servicesCheck = new ServicesCheck();
servicesCheck.setServiceEnabled(true);
insert(servicesCheck);
}
end
如果启用了服务,则每5分钟插入一次servicesCheck对象。插入此对象后,我的其他规则将触发并从那里撤回servicesCheck事实。
我面临的问题是当我关闭应用程序并在第二天启动时。那时,ServiceCheck规则在停止之前会被激活一段时间。我的假设是最后一次被激活的时间被保存在会话中,当我重新启动时,它会找到当前时间和已保存时间之间的差异,并触发规则,直到会话中的2次匹配为止。如此有效地,为了赶上从关机到重启的1小时差距,在这种情况下,它将启动规则12次,因为间隔设置为5分钟。有没有一种方法可以用来更新规则会话中的最后一次激活时间,这样它就可以像一个全新的开始一样开始工作而不会占用时间。
答案 0 :(得分:0)
我想你是在坚持整个会议?我想你有一个关机程序。您可以使用单个事实,我们将其称为Trigger
。将您的规则修改为
rule "ServiceCheck"
timer ( int: 3m 5m )
when
Trigger()
then
// ... same
end
您必须在启动后插入一个Trigger事实,并在关机期间撤消。
<强>后来强>
我已经设置了一个实验(使用5.5.0),其中一个会话正在运行,在一个线程中使用fireUntilHalt调用,其规则类似于&#34; ServiceCheck&#34;。另一个线程会休眠一段时间,在撤消触发器事实后暂停会话。在定时器触发间隔超过两倍之后,第二个线程再次插入触发器,发出第一个线程重新进入fireUntilHalt()的信号,第二个线程将重复其循环。 我可以在缩回触发器的时间段内观察到沉默。
但是,如果没有缩回/重新插入触发器,则会话重启后会发生一连串的发射。
这表示撤消和重新插入触发器确实会停止并重新启动计时器规则。