Drools Fusion(CEP)定義と使い方解説


Drools統一挙動モデリングプラットフォームの視野から,Drools Fusionはイベント処理挙動を有効にするモジュールである。
定義
複雑なイベントの処理をサポートするのは、単純な理解よりもはるかに多く、cepシーンにはいくつかの共通点があります。
  • は通常、大きなイベントを処理する必要がありますが、ほんの一部のイベントだけが本当に関心があります。
  • イベントは、状態変化の記録であるので、通常不変である。
  • は、通常、イベントに関するルールおよびクエリは、受動モードで実行される必要があります。すなわち、イベントモードの検出に反応します。
  • は、通常、関連するイベントの間に強い時間関係がある。
  • 個別イベントは通常重要ではない。システム関心関連イベントのパターンとその関係
  • は、一般的に、グループ化および統合されたイベントの実行をシステムに要求する。
  • フュージョンを使って、droolsに挿入されたデータをイベントとして宣言します。
    drools処理データには2つの方法があります。クラウドモードとフローモードはデフォルトでクラウドモードです。フュージョンを使って、フローモードに設定する必要があります。フローモード、挿入されたデータはイベントといい、時間順があります。クラウドモードはありません。
    ストリームサポート
    ほとんどのCEPの用例はイベントフローを処理しなければならない。
    ストリームの特性:
  • は、ストリーム内のイベントをタイムスタンプで並べ替える。
  • 事件の数はいつも高いです。
  • 原子事件自体は滅多に役に立ちません。一般的に、複数のイベント間の相関またはストリームまたは他のソースから意味を抽出する。
  • ストリームは、単一のタイプのイベントを含む同様のものであってもよい。または、異種のイベント、すなわち様々なタイプのイベントが含まれています。
  • フローモードを宣言
    kmodule.xmlにeventProcessigMode=「stream」を流し込みモードにします。
    
    <kbase name="fusionAge" eventProcessingMode="stream" packages="com.us.fusion">
        <ksession name="fusionAgeKS" type="stateful"/>
    </kbase>
    イベント宣言
    フュージョンを使って、droolsに挿入されたデータをイベントとして宣言します。イベントは@roleラベルを使います。
    @role
    @roleメタデータラベルをこの事実グループの行に割り当てます。
    たとえば:
    Personはjava beanという事実のタイプです。
    
    declare Person
      @role(event)
    end
    Personの属性は以下の通りです。
    
    public class Person {
      private String name;
      private Integer age;
      private String like;
      private String sex;
      private String desc;
      private String address;
      private Date createTime;
      // getter setter   
    @timestamp
    各イベントには、関連するタイムスタンプが割り当てられています。デフォルトでは、与えられたイベントのタイムスタンプは、イベントがワークメモリに挿入されたときに、Session Clockから読み出し、イベントに割り当てられます。時には、イベントはタイムスタンプを自分の属性として使用します。この場合、ユーザは@timestampでユーザ属性をタイムスタンプとしてマークすることができます。
    例えば、PersonのcreateTime属性をタイムスタンプとします。
    
    declare Person
      @role(event)
      @timestamp( createTime )
    end
    @expires
    重要です。このラベルはエンジンが流れるモードでしか考えられません。
    ラベルは、イベントがいつ期限切れになるかを定義し、イベントが一致しなくなり、任意のルールがアクティブになる場合があります。
    次のように使う
        @expires(1 h 35 m)
    personの例では、賞味期限を20 Sと仮定します。
    
    declare Person
      @role(event)
      @timestamp( createTime )
      @expires(20s)
    end
    スライド時間ウィンドウ
    スライド時間ウィンドウは、最近のX時間セル内で発生したイベントにのみマッチする規則をユーザに作成することができます。
    
    rule "boy"
       when
          $p : Person(age < 25) over window:time(3s)
       then
          $p.setDesc("  ");
          retract($p);
    end
    例えば、最近の3秒以内だけで、年齢が25未満の人。
    コールコードは以下の通りです。
    
    package com.us.fusion;
    import com.us.model.Person;
    import org.kie.api.KieServices;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.KieSession;
    import java.util.Date;
    /**
     * Created by yangyibo on 17/1/3.
     * @author yangyibo
     */
    public class Application {
      private static KieSession getSession() {
        KieServices ks = KieServices.Factory.get();
        KieContainer kc = ks.getKieClasspathContainer();
        return kc.newKieSession("fusionAgeKS");
      }
      public static void run() {
        KieSession ks = getSession();
        Person p1 = new Person("   ", 2,new Date());
        Person p2 = new Person("   ", 7,new Date());
        try {
          Thread.sleep(4000);
        } catch (InterruptedException e) {
          System.out.println(e);
        }
        Person p3 = new Person("   ", 16,new Date());
        ks.insert(p1);
        ks.insert(p2);
        ks.insert(p3);
        int count = ks.fireAllRules();
        System.out.println("    " + count + "   ------------------------------");
    //    ks.dispose();
      }
      public static void main(String[] args) {
        run();
      }
    }
    ルールコードは以下の通りです。
    
    package com.us.fusion7
    import com.us.model.Person
    function void printName(String streamName,String name,int age,String desc) {
          System.out.println("streamName:"+streamName+" name:"+name+" age:"+age+" desc:"+ desc);
        }
    declare Person
      @role(event)
      @timestamp( createTime )
      @expires(20s)
    end
    rule "boy"
       when
          $p : Person(age > 0) over window:time(3s)
       then
          $p.setDesc("  ");
          retract($p);
          printName("boy",$p.getName(),$p.getAge(),$p.getDesc());
    end
    Thread.sleep(4000);だから最近3秒以内に李大嘴だけが記録されています。
    結果は以下の通りです
    stream Name:boy  name:李大嘴age:16 desc:少年
    総括的に1条の規則を実行しました------------------
    サンプル2 10 S以内の平均年齢
    スライド長ウィンドウ
    スライド時間ウィンドウと似ています。最近のイベントのみにマッチします。
    
    rule "old"
       when
          $p : Person(age > 49) over window:length(2)
       then
          $p.setDesc("  ");
          retract($p);
    end
    例えば、49歳以上の年収の最近の2つの記録。
    コールコード:
    
    public class Application {
      private static KieSession getSession() {
        KieServices ks = KieServices.Factory.get();
        KieContainer kc = ks.getKieClasspathContainer();
        return kc.newKieSession("fusionAgeKS");
      }
      public static void run() {
        KieSession ks = getSession();
        Person p1 = new Person("   ", 52,new Date());
        Person p2 = new Person("   ", 57,new Date());
        try {
          Thread.sleep(4000);
        } catch (InterruptedException e) {
          System.out.println(e);
        }
        Person p3 = new Person("   ", 56,new Date());
        ks.insert(p1);
        ks.insert(p2);
        ks.insert(p3);
        int count = ks.fireAllRules();
        System.out.println("    " + count + "   ------------------------------");
        ks.dispose();
      }
      public static void main(String[] args) {
        run();
      }
    }
    ルールコード
    
    package com.us.fusion7
    import com.us.model.Person
    function void printName(String streamName,String name,int age,String desc) {
          System.out.println("streamName:"+streamName+" name:"+name+" age:"+age+" desc:"+ desc);
        }
    declare Person
      @role(event)
      @timestamp( createTime )
      @expires(20s)
    end
    rule "old"
       when
          $p : Person(age > 49) over window:length(2)
       then
          $p.setDesc("  ");
          retract($p);
          printName("boy",$p.getName(),$p.getAge(),$p.getDesc());
    end
    ルールに合った一番近い二つの記録しかないので、「白堂記録」を捨てます。
    実行結果
    stream Name:boy  name:李大嘴age:56 desc:老年
    stream Name:boy  name:tong湘玉age:57 desc:老年
    総執行は2条の規則--------------------
    本論文の全ての試験例のpom依存性
    
        <dependency>
          <groupId>org.kie</groupId>
          <artifactId>kie-api</artifactId>
          <version>6.5.0.Final</version>
        </dependency>
        <dependency>
          <groupId>org.drools</groupId>
          <artifactId>drools-core</artifactId>
          <version>6.5.0.Final</version>
        </dependency>
        <dependency>
          <groupId>org.drools</groupId>
          <artifactId>drools-compiler</artifactId>
          <version>6.5.0.Final</version>
        </dependency>
        <dependency>
          <groupId>org.drools</groupId>
          <artifactId>drools-decisiontables</artifactId>
          <version>6.5.0.Final</version>
        </dependency>
        <dependency>
          <groupId>org.drools</groupId>
          <artifactId>drools-templates</artifactId>
          <version>6.5.0.Final</version>
        </dependency>
    本明細書の全ての試験例のkmodule.xml構成
    
     <kbase name="fusionAge" eventProcessingMode="stream" packages="com.us.fusion">
        <ksession name="fusionAgeKS" type="stateful"/>
     </kbase>
    その他のキーワード:After、Before、During、Meetなどのキーワードはいずれも二つのイベントの発生時間の順序を比較するために使われます。使い方は後で説明します。
    締め括りをつける
    以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。もっと知りたいなら、下のリンクを見てください。