我使用下面的规则来触发警报,以防有一个绿色包被发送,后面跟着一个红包。
package com.myspace.floodmonitoringrules;
import java.lang.Number;
import java.util.ArrayList;
rule "rule3"
dialect "mvel"
enabled true
when
w : ArrayList( size() == 1 ) from collect ( devicestatus( flood_status_color == "green" ) over window:length (1))
ds : devicestatus( flood_status_color == "red" )
then
ds.setFlood_alert( "WindowDetected" );
end然而,规则是在发送任何红包之后被触发,即使之前没有发送绿色数据包也是如此。这就是我将ksession定义为状态的时候。当我将它定义为无状态时,规则就是根本不被解雇!
我需要了解我的行为,因为我对口水不熟悉。
发布于 2020-06-11 19:28:41
这应该符合你的要求。
declare Status @role (event) end
rule "rule3"
dialect "mvel"
enabled true
when
$list : List() from collect (Status() over window:length (2))
$g : Status( floodStatusColor == "green" ) from $list
$r : Status( floodStatusColor == "red", this after $g ) from $list
then
System.out.println("WindowDetected")
end测试
@DroolsSession("test.drl")
public class PlaygroundTest {
@Rule
public DroolsAssert drools = new DroolsAssert();
@Test
public void testIt() {
drools.insertAndFire(new Status("red"));
drools.advanceTime(1, SECONDS);
drools.insertAndFire(new Status("green"));
drools.advanceTime(1, SECONDS);
drools.insertAndFire(new Status("green"));
drools.advanceTime(1, SECONDS);
drools.insertAndFire(new Status("red"));
drools.advanceTime(1, SECONDS);
drools.insertAndFire(new Status("green"));
drools.advanceTime(1, SECONDS);
drools.insertAndFire(new Status("red"));
drools.advanceTime(1, SECONDS);
drools.insertAndFire(new Status("red"));
drools.advanceTime(1, SECONDS);
drools.insertAndFire(new Status("red"));
drools.advanceTime(1, SECONDS);
drools.insertAndFire(new Status("green"));
drools.advanceTime(1, SECONDS);
drools.insertAndFire(new Status("red"));
}输出
00:00:00 --> inserted: Status[floodStatusColor=red]
00:00:00 --> fireAllRules
00:00:01 --> inserted: Status[floodStatusColor=green]
00:00:01 --> fireAllRules
00:00:02 --> inserted: Status[floodStatusColor=green]
00:00:02 --> fireAllRules
00:00:03 --> inserted: Status[floodStatusColor=red]
00:00:03 --> fireAllRules
00:00:03 <-- 'rule3' has been activated by the tuple [InitialFactImpl, ArrayList, Status, Status]
WindowDetected
00:00:04 --> inserted: Status[floodStatusColor=green]
00:00:04 --> fireAllRules
00:00:05 --> inserted: Status[floodStatusColor=red]
00:00:05 --> fireAllRules
00:00:05 <-- 'rule3' has been activated by the tuple [InitialFactImpl, ArrayList, Status, Status]
WindowDetected
00:00:06 --> inserted: Status[floodStatusColor=red]
00:00:06 --> fireAllRules
00:00:07 --> inserted: Status[floodStatusColor=red]
00:00:07 --> fireAllRules
00:00:08 --> inserted: Status[floodStatusColor=green]
00:00:08 --> fireAllRules
00:00:09 --> inserted: Status[floodStatusColor=red]
00:00:09 --> fireAllRules
00:00:09 <-- 'rule3' has been activated by the tuple [InitialFactImpl, ArrayList, Status, Status]
WindowDetected您可能想看看similar question,它更复杂、更有趣。
如果其他规则不需要较早的事件,则无需滑动窗口的替代解决方案。
rule "rule3"
when
$g : Status( floodStatusColor == "green" )
$r : Status( floodStatusColor == "red", this after $g )
then
System.out.println("WindowDetected");
end
rule "rule3 cleanup"
salience -1
when
$e : Status()
Status( this after $e )
then
delete($e);
end发布于 2020-06-13 16:49:29
我在您的代码中添加了retract( $g );然后它现在已经完美地工作了。
rule "rule3"
dialect "mvel"
enabled true
when
$list : List() from collect (Status() over window:length (2))
$g : Status( floodStatusColor == "green" ) from $list
$r : Status( floodStatusColor == "red", this after $g ) from $list
then
System.out.println("WindowDetected")
retract( $g );
endhttps://stackoverflow.com/questions/62328760
复制相似问题