首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流口水窗口长度和行为

流口水窗口长度和行为
EN

Stack Overflow用户
提问于 2020-06-11 16:14:28
回答 2查看 185关注 0票数 1

我使用下面的规则来触发警报,以防有一个绿色包被发送,后面跟着一个红包。

代码语言:javascript
复制
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定义为状态的时候。当我将它定义为无状态时,规则就是根本不被解雇!

我需要了解我的行为,因为我对口水不熟悉。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-11 19:28:41

这应该符合你的要求。

代码语言:javascript
复制
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

测试

代码语言:javascript
复制
@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"));
    }

输出

代码语言:javascript
复制
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,它更复杂、更有趣。

如果其他规则不需要较早的事件,则无需滑动窗口的替代解决方案。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-06-13 16:49:29

我在您的代码中添加了retract( $g );然后它现在已经完美地工作了。

代码语言:javascript
复制
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 );

end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62328760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档