Drools 下垂-滑动窗口未按预期工作

Drools 下垂-滑动窗口未按预期工作,drools,Drools,我不太会流口水。我已经定义了以下规则来将流中的最后两个数字相加。然后,我发送100个事件流,值设置为1到100。所以我希望输出是0,1,3,5,7,9,11,13等等 declare TestEvent @role( event ) value : int end rule "Simple Rule" when $sum : Integer() from accumulate ( TestEvent( $value : value ) over window:leng

我不太会流口水。我已经定义了以下规则来将流中的最后两个数字相加。然后,我发送100个事件流,值设置为1到100。所以我希望输出是0,1,3,5,7,9,11,13等等

declare TestEvent
     @role( event )
     value : int
end
rule "Simple Rule"
when
    $sum : Integer() from accumulate ( TestEvent( $value : value ) over window:length( 2 ); sum( $value)  )
then
    System.out.println("Value: " + $sum );
end
会话在单独的线程中使用“fireUntilHalt”启动。如果我在插入的每个事件之间设置10毫秒的延迟,它将按预期工作。然而,当我没有延迟时,结果并不像预期的那样。通常它只打印0和197。有时,我可能会得到一个或两个数字之间以及


为什么会发生这种情况?我应该做些什么来修复呢?

滑动窗口是一个拐杖。用简单的逻辑代替它

class Pred {
   Integer pred;
}

rule procInt1
when
  $p: Pred( pred == null )
  $i: Integer()
then
  modify( $p ){ setPred( $i ); }
end

rule procInt
when
  $p: Pred( $i1: pred != null )
  $i2: Integer()
then
  System.out.println( $i1 + $i2 );
  modify( $p ){ setPred( $i2 ); }
end

有两个线程的事实并不意味着没有竞争条件。线程插入事件没有挂起,因此一切都是可能的。

好的,我终于明白了。 在一个单独的线程中运行
fireUntilHalt
意味着只会时不时地对规则进行评估(不确定该时间段是什么)。我的假设是,它们将在每次
插入时进行评估。因此,在每次
insert
中,累加器值都会更新,但所计算的规则不会计算。因为我的规则插入得很快(大约一秒钟),所以第一次和最后一次插入似乎就是要计算的全部内容


为了使这项工作正常进行,以便对每个插入都进行评估,我删除了
fireUntilHalt
,并在每次插入后单独执行
fireAllRules

与时间相关的规则依赖于“时间”。流口水的最小时间间隔似乎是1毫秒。规则将在每次插入时进行评估(相应的结果将添加到议程中),但议程将在下一毫秒(或当您明确触发所有规则时)执行。

感谢您的建议。不过,我想了解的是滑动窗口(及其局限性)。目前我一点也不明白为什么我会得到我想要的结果。如果结果取决于向流中发射事件的速度,那么它们似乎有很大的缺陷。知道我为什么会有这种行为吗?Drools引擎可以做的任何事情都取决于Java的线程调度。如果你在一个任务中塞进5个事件,并要求最后两个:你期望什么?我期望规则在每次插入时都得到评估。显然情况并非如此,因此Fireuntlhalt是否非常不安全,因为在事件被替换时,可能并非所有规则都会正确触发?哦,是的,每次插入都会对LHS进行评估,但这并不意味着规则会触发。-在现实场景中,事件不是由循环产生的,它们通过一些i/o接口到达,这将导致线程重新调度。但要求“最后2个”意味着不管怎样,你都会得到最后2个。谢谢,这越来越清楚了。所以我试图理解这些限制。因此,如果我有一个场景,需要检测序列中的三个事件是否呈上升趋势,那么如果一个事件流以非常快的速度触发,我是否有可能使用fireUntilHalt忽略这一点,因为累加中的值将替换为最新触发的事件?