首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于跟踪条件的Drools融合滑动时间窗口

用于跟踪条件的Drools融合滑动时间窗口
EN

Stack Overflow用户
提问于 2015-02-17 05:31:23
回答 1查看 460关注 0票数 1

使用Drools融合,我想为计算机的cpu_idle做一些报警。条件是:

  1. 我会从我每10s监控的机器上收到一份记录;
  2. 如果cpu_idle<10,drools应该打开一个时间窗口,可能是10m,并开始计算条件cpu_idle<10发生了多少次,变量是occur_times。
  3. 10分钟后,流口水检查occur_times.if occur_times>5,然后做一些报警,否则什么也不做。

我不知道该怎么做。我使用drools 6.1。以下是主要代码:

代码语言:javascript
复制
public static void main(String[] args) {
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add( ResourceFactory.newByteArrayResource(str.getBytes()),
                  ResourceType.DRL );
    InternalKnowledgeBase kbase = (InternalKnowledgeBase) KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

    EntryPoint atmStream = ksession.getEntryPoint("ATM Stream" );

     ksession.fireAllRules();
}

我有一个记录豆,就像:

代码语言:javascript
复制
public class Record {

    private double cpu_idle;
    private Timestamp collecte_time;
    public double getCpu_idle() {
        return cpu_idle;
    }
    public void setCpu_idle(double cpu_idle) {
        this.cpu_idle = cpu_idle;
    }
    public Timestamp getCollecte_time() {
        return collecte_time;
    }
    public void setCollecte_time(Timestamp collecte_time) {
        this.collecte_time = collecte_time;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-03-02 06:58:30

你需要一个

代码语言:javascript
复制
class Window {
    int count = 1;
    long time;
    Window( long time ){...}
    // getters and setters
}

和下列规则(均未经测试):

代码语言:javascript
复制
rule "nothing to do"
when
    $r: Record( cpu_idle >= 10 )
    not Window()
then
    retract( $r );
end

rule "open new window"
when
    $r: Record( cpu_idle < 10, $ts: collecte_time )
    not Window()
then
    insert( new Window( $ts.getTime() ) );
    retract( $r );
end

rule "keep window"
when
    $r: Record( cpu_idle >= 10, $ts: collecte_time )
    $w: Window( $ns: time )
    eval( ($ts.getTime() - $ns)/1000 <= 10*60)
then
    retract( $r );
    modify( $w ){ setCount( $w.getCount() + 1 ) }
end

rule "drop window"
when
    $r: Record( cpu_idle >= 10, $ts: collecte_time )
    $w: Window( $ns: time )
    eval( ($ts.getTime() - $ns)/1000 > 10*60)
then
    retract( $r );
    retract( $w );
end

rule "alarm"
when
    $w: Window( count >= 5 )
then
    // raise alarm
    retract( $w );
end

我会在记录中使用日期而不是lava.sql.Timestamp。

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

https://stackoverflow.com/questions/28555311

复制
相关文章

相似问题

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