[英]Stateless Vs Stateful Session behavior in 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
輸入對象(Fact)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);
}
}
無狀態會話測試代碼的輸出:
Not eligible for license Setting Valid to false Second rule fired Updated Applicant = Applicant [name=Mr John Smith, age=16, valid=false]
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);
}
}
有狀態會話測試代碼的輸出:
Not eligible for license Setting Valid to false Second rule fired Updated Applicant = Applicant [name=Mr John Smith, age=16, valid=false]
再次要求每個人幫助我理解有狀態和無狀態會話的正確行為。
在此先感謝Manish Gandhi
據我所知,當您在無狀態會話中觸發規則時,更改不會觸發新規則。 但這並不意味着規則不會因為變化而被解雇。 第一個規則更改有效值,這意味着當您檢查第二個規則的條件時,有效已經為假並且規則觸發。
如果更改影響了先前規則的“何時”部分,則在無狀態會話中,第一個規則將不會被第二次觸發,而第一個規則將在第一個規則中觸發。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.