私は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、偽=有効]
を解雇しましたステートフルセッションとステートレスセッションの正しい振る舞いを理解するために皆さんに私を助けてください。事前に
おかげで、 マニッシュガンジー