drools中的无状态与有状态会话行为
我对口水还不熟悉。我试图理解Drools提供的无状态会话和有状态会话之间的区别 据我初步了解, 在无状态会话的情况下,如果事实在任何规则的操作执行期间被修改,那么它将不会被重新提交到推理引擎以找出与修改后的事实匹配的新规则 在有状态会话的情况下,如果事实在任何规则的操作执行过程中被修改,那么它将被重新提交给推理机,以找出与修改后的事实匹配的新规则,然后执行它们相应的操作 因此,当我试图通过编写一个示例规则来验证这种行为时,我发现这两种情况下的行为完全相同。所以现在我对有状态会话和无状态会话之间的区别感到困惑 我想请大家帮助我理解有状态和无状态会话的正确行为 我正在粘贴有状态和无状态会话的示例代码及其输出和示例规则,以供参考drools中的无状态与有状态会话行为,drools,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
无状态SessionExample.java(无状态会话测试代码)
无状态会话测试代码的输出:
StatefulSessionExample.java(无状态会话测试代码)
有状态会话测试代码的输出:
再次请求大家帮助我理解有状态和无状态会话的正确行为
提前感谢,,
Manish Gandhi据我所知,在无状态会话中启动规则时,更改不会触发新规则。但这并不意味着规则不会因为改变而被取消。第一个规则更改valid的值,这意味着当您检查第二个规则的条件valid时,它已经为false,并且规则将触发
如果更改影响了前一条规则的“何时”部分,则在无状态会话中,第一条规则不会再次触发,而在第一条规则中会再次触发。我也有同样的问题。如果您的疑问得到解决,请发布您的答案。
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
+ "]";
}
}
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]
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]