1

Drools fusion を使用して、コンピューターの cpu_idle に対して何らかのアラームを実行したいと考えています。条件は次のとおりです。

  1. 監視したマシンから 10 秒ごとに記録を受け取ります。

  2. cpu_idle<10 の場合、drools はおそらく 10mim の時間ウィンドウを開き、条件 cpu_idle<10 が発生した回数のカウントを開始する必要があります。変数は occur_times です。

  3. 10 分後、よだれが発生時間を確認します。

これを行う方法がわかりません。私は drools 6.1 を使用しています。以下はメイン コードです:</p>

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();
}

次のようなレコード Bean があります。

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;
    }
}
4

1 に答える 1

0

あなたには必要だ

class Window {
    int count = 1;
    long time;
    Window( long time ){...}
    // getters and setters
}

および次のルール (すべて未テスト):

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

Record では lava.sql.Timestamp ではなく Date を使用します。

于 2015-03-02T06:58:30.573 に答える