2016-10-22 4 views
0

私はdroolsを初めて使っています。私はDroolsが提供するステートレスセッションとステートフルセッションの違いを理解しようとしていました。実際には、任意のルールのアクション実行時に変更された場合、私の最初の理解あたりとしてドレスのステートレス対ステートフルセッションの振る舞い

、ステートレスセッションの場合

、それが一致する新しいルールを見つけるためにエンジンを推論するために再提出されません変更された事実。

ステートフルセッションの場合、実際のルールのアクション実行中にファクトが変更されると、推論エンジンに再提出され、変更されたファクトと一致する新しいルールが見つけられ、対応するアクションが実行されます。

サンプルルールを記述してこの動作を検証しようとしたとき、その動作が両方のケースでまったく同じであることがわかりました。今はステートフルセッションとステートレスセッションの違いについて本当に混乱しています。

私は、ステートフルセッションとステートレスセッションの正しい動作を理解するのを助けてください。

参考までに、ステートフルセッションとステートレスセッションのサンプルコードを出力とサンプルルールと共に貼り付けています。

licenseApplication.drl (Rule file) 

package com.idal.droolsapp 

rule "Is of valid age" 
    no-loop 
when 
    $a : Applicant(age < 18) 
then 
    System.out.println("Not eligible for license"); 
    System.out.println("Setting Valid to false"); 
    modify($a) { setValid(false) }; 
end 

rule "Is of valid false" 
    salience 100 
when 
    $a : Applicant(valid == false) 
then 
    System.out.println("Second rule fired"); 
end 

入力オブジェクト(ファクト)Applicant.java

package com.idal.droolsapp; 

public class Applicant { 

    private String name; 

    private int age; 

    private boolean valid = true; 

    public Applicant(String name, int age) { 
     setName(name); 
     setAge(age); 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setValid(boolean valid) { 
     this.valid = valid; 
    } 

    public boolean isValid() { 
     return valid; 
    } 

    @Override 
    public String toString() { 
     return "Applicant [name=" + name + ", age=" + age + ", valid=" + valid 
       + "]"; 
    } 


} 

StatelessSessionExample.java(ステートレスセッションテストコード)

package com.idal.droolsapp; 

import org.drools.KnowledgeBase; 
import org.drools.KnowledgeBaseFactory; 
import org.drools.builder.KnowledgeBuilder; 
import org.drools.builder.KnowledgeBuilderFactory; 
import org.drools.builder.ResourceType; 
import org.drools.io.ResourceFactory; 
import org.drools.runtime.StatelessKnowledgeSession; 

public class StatelessSessionExample { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     KnowledgeBuilder kbuilder = KnowledgeBuilderFactory 
       .newKnowledgeBuilder(); 

     kbuilder.add(ResourceFactory.newClassPathResource(
       "licenseApplication.drl", StatelessSessionExample.class), 

     ResourceType.DRL); 

     if (kbuilder.hasErrors()) { 

      System.err.println(kbuilder.getErrors().toString()); 

     } 

     KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); 

     kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 

     StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession(); 

     Applicant applicant = new Applicant("Mr John Smith", 16); 

     ksession.execute(applicant); 

     System.out.println("Updated Applicant = " + applicant); 
    } 

} 

ステートレスセッションテストコードの出力:

ありませんライセンス対象 有効を偽に設定する 二番目のルールは 更新申請者=申込者[名=ミスタージョン・スミス、年齢= 16、有効=偽]

StatefulSessionExample.java(ステートレスセッションテストコード)

package com.idal.droolsapp; 

import org.drools.KnowledgeBase; 
import org.drools.KnowledgeBaseFactory; 
import org.drools.builder.KnowledgeBuilder; 
import org.drools.builder.KnowledgeBuilderFactory; 
import org.drools.builder.ResourceType; 
import org.drools.io.ResourceFactory; 
import org.drools.runtime.StatefulKnowledgeSession; 

public class StatefulSessionExample { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     KnowledgeBuilder kbuilder = KnowledgeBuilderFactory 
       .newKnowledgeBuilder(); 

     kbuilder.add(ResourceFactory.newClassPathResource(
       "licenseApplication.drl", StatefulSessionExample.class), 

     ResourceType.DRL); 

     if (kbuilder.hasErrors()) { 

      System.err.println(kbuilder.getErrors().toString()); 

     } 

     KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); 

     kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 

     StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 

     Applicant applicant = new Applicant("Mr John Smith", 16); 

     ksession.insert(applicant); 

     ksession.fireAllRules(); 

     ksession.dispose(); 

     System.out.println("Updated Applicant = " + applicant); 
    } 

} 

にステートフルセッションテストコードの出力を解雇しました:

ないための有効なライセンス設定 の対象偽 二番目のルールは 更新申請者=申込者[名=ミスタージョン・スミス、年齢= 16、偽=有効]

を解雇しました

ステートフルセッションとステートレスセッションの正しい振る舞いを理解するために皆さんに私を助けてください。事前に

おかげで、 マニッシュガンジー

答えて

0

あなたがステートレスセッションでルールを起動するとき、私はそれを理解したように、変更が新しいルールをトリガしません。しかし、それはルールが変更のために解雇されることを意味しません。最初のルールはvalidの値を変更します。つまり、2番目のルールの条件を確認するまでにvalidは既に偽であり、ルールが起動します。

変更が前のルールの「when」部分に影響する場合、ステートレスセッションでは、最初のルールは2回目にトリガされません。最初のルールは最初のルールでトリガされません。