1

Drools は初めてです。Drools Fusion を使用して単純な複合イベント処理 (CEP) アプリケーションを作成しようとしています。

私の要件は

  - on receipt of a CRITICAL event, perform an action (right now that's a SOP)
  - if another CRITICAL event arrives within 5 minutes of the previous event 
    and from the same source, ignore it

次のような単純な Event クラスがあります。

public class Event {

    private String id;
    private Date timestamp;
    private String source;
    private Event.Severity severity;
    private String description;

 /// With Getter and Setter ///

}

ルール ファイルは次のとおりです。

declare Event
 @role(event)  
 end
 rule "Alert for CRITICAL events. Don't alert for the next 5 minutes if
 from the same source"
 when
        $ev1: Event($source: source, severity == Event.Severity.CRITICAL) 
              from entry-point "events"
        not (
              Event(this != $ev1, source == $source, 
              severity == Event.Severity.CRITICAL,
              this before [1ms, 5m] $ev1) from entry-point "events"
              )
 then
        System.err.println("###### CRITICAL alert caused by event: " 
                            + $ev1.getId()); 
 end

テストのために、次のタイムライン 0m、4m、10m、12m でそれぞれ e1、e2、e3、e4 の 4 つのイベントをワーキング メモリに注入しています。

Java クラス ファイル

Event event1 = new Event("e1", new Date(), "server1",
        Event.Severity.CRITICAL, "server down");

//calendar.add(Calendar.MINUTE, 4);
Event event2 = new Event("e2", new Date(), "server1",
        Event.Severity.CRITICAL, "server down");

//calendar.add(Calendar.MINUTE, 6);
Event event3 = new Event("e3", new Date(), "server1",
        Event.Severity.CRITICAL, "server down");

//calendar.add(Calendar.MINUTE, 2);
Event event4 = new Event("e4", new Date(), "server1",
        Event.Severity.CRITICAL, "server down");

eventsEP.insert(event1);
clock.advanceTime(4, TimeUnit.MINUTES);
eventsEP.insert(event2);
clock.advanceTime(6, TimeUnit.MINUTES);
eventsEP.insert(event3);
clock.advanceTime(2, TimeUnit.MINUTES);
eventsEP.insert(event4);

ksession.fireAllRules();

前のイベントがないため、e1 はルールに合格すると予想されます。また、前のイベントが 6 分離れているため、e3 も合格すると予想しています。

ただし、別の出力が得られます。

出力を期待する

  • イベントによる重大なアラート: e1
  • イベントによるクリティカル アラート: e3

しかし、私は得ています

  • イベントによる重大なアラート: e1
  • イベントによる重大なアラート: e2
  • イベントによるクリティカル アラート: e3

追加情報: イベント処理に STREAM モードを使用しています。誰でも出力を説明して、どこが間違っているか教えてください。ありがとう!

4

2 に答える 2

0

確かにそうしましたが、クロックタイプをデフォルトのリアルタイムではなく疑似に明示的に設定したことを確認したかっただけです。

KnowledgeSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
config.setOption( ClockTypeOption.get("pseudo") );

また、advanceTime() を複数回呼び出した後、fireAllRules() を 1 回呼び出すだけでも問題が発生する可能性があります。別のスレッドで fireUntilHalt() を実行するか、advanceTime() を呼び出すたびに fireAllRules() を呼び出すことができます。このリンクをチェックしてください:

Drools Fusion サンプル

于 2013-07-24T17:38:30.080 に答える