-1

我有一个场景,我想将规则纯粹用作调用其他服务的计划作业。我正在使用类似于答案 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 分钟。有没有一种方法可以更新规则会话上的最后触发时间,以便它像一个新的开始一样开始工作,而不会赶上丢失的时间。

4

1 回答 1

0

我想你正在坚持整个会话?我想你有一个关机程序。您可以使用单个 Fact,我们称之为Trigger。将您的规则修改为

rule "ServiceCheck"
  timer ( int: 3m 5m )
when
  Trigger()
then
  // ... same
end

您必须在启动后插入一个 Trigger 事实,并在 shutdown 期间收回它

之后

我已经设置了一个实验(使用 5.5.0),其中一个会话正在运行,在一个线程中使用 fireUntilHalt 调用,使用类似“ServiceCheck”的规则。另一个线程将休眠一段时间,在收回触发事实后停止会话。在超过一倍的定时器触发间隔后,第二个线程再次插入 Trigger,信号第一个线程重新进入 fireUntilHalt(),第二个线程将重复其循环。在扳机收回期间,我可以观察到静默。

但是,如果触发器没有收回/重新插入,则在会话重新启动后会出现一连串的触发。

这表明收回和重新插入触发器确实会停止并重新启动计时器规则。

于 2014-09-17T16:05:23.227 回答