决策中的 Drools 无限循环 table
Drools infinite loop in decision table
我是 Drools 和决定 table 的新手。我需要创建一个规则来测试一个人是否 Older/young 使用规则的人年龄。该规则有效,但处于无限循环中。
这是规则,是基本的,年龄> 18 的人年龄大,或者,年龄小于18 的人年龄小。以下是我的 Excel 文件中的 HTML:
<style type="text/css">
table.tableizer-table {
font-size: 10px;
border: 1px solid #CCC;
font-family: Courier New, Courier, monospace;
}
.tableizer-table td {
padding: 4px;
margin: 3px;
border: 1px solid #CCC;
}
.tableizer-table th {
background-color: #DED11F;
color: #FFF;
font-weight: bold;
}
</style>
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th></th><th> </th><th>RuleTable Person</th><th> </th><th> </th><th> </th><th> </th></tr></thead><tbody>
<tr><td> </td><td> </td><td>CONDITION</td><td> </td><td>ACTION</td><td>ACTION</td><td>ACTION</td></tr>
<tr><td> </td><td> </td><td>p:Persona</td><td> </td><td> </td><td> </td><td> </td></tr>
<tr><td> </td><td> </td><td>edad >= </td><td>edad <</td><td>System.out.println( "Age: " + p.getEdad());</td><td>p.setMayorEdad($param);update(p);</td><td>System.out.println( "Older:" +p.isMayorEdad());</td></tr>
<tr><td> </td><td>Person rules</td><td>Status</td><td>Status</td><td>print</td><td>Is older?</td><td>Print ?</td></tr>
<tr><td> </td><td>Older</td><td>18</td><td> </td><td>X</td><td>true</td><td>X</td></tr>
<tr><td> </td><td>Yougn</td><td> </td><td>18</td><td>X</td><td>false</td><td>X</td></tr>
</tbody></table>
My Persona class 是一个简单的 POJO,用于测试决策 table:
人class(静态,在主要class):
public static class Persona{
String nombre;
String apellidoPaterno;
String apellidoMaterno;
int edad;
float salario;
boolean mayorEdad = false;
public Persona() {
super();
}
public Persona(String nombre, String apellidoPaterno, String apellidoMaterno, int edad, float salario) {
super();
this.nombre = nombre;
this.apellidoPaterno = apellidoPaterno;
this.apellidoMaterno = apellidoMaterno;
this.edad = edad;
this.salario = salario;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellidoPaterno() {
return apellidoPaterno;
}
public void setApellidoPaterno(String apellidoPaterno) {
this.apellidoPaterno = apellidoPaterno;
}
public String getApellidoMaterno() {
return apellidoMaterno;
}
public void setApellidoMaterno(String apellidoMaterno) {
this.apellidoMaterno = apellidoMaterno;
}
public int getEdad() {
return edad;
}
public void setEdad(int edad) {
this.edad = edad;
}
public float getSalario() {
return salario;
}
public void setSalario(float salario) {
this.salario = salario;
}
public boolean isMayorEdad() {
return mayorEdad;
}
public void setMayorEdad(boolean mayorEdad) {
this.mayorEdad = mayorEdad;
}
}
我的主要方法是将 drools 6.5 与 JRE 1.7 一起使用:
public static final void main(String[] args) {
try {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-dtables");
Persona p = new Persona();
p.setNombre("Person");
p.setEdad(18);
p.setMayorEdad(true);
kSession.insert(p);
kSession.fireAllRules();
kSession.dispose();
} catch (Throwable t) {
t.printStackTrace();
}
}
这是无限循环的输出。
Age: 4
Older:false
Age: 4
Older:false
Age: 4
Older:false
Age: 4
Older:false
Age: 4
感谢任何提示、link、教程等。
一旦您对事实使用 update()
,评估将再次开始,规则将再次触发,因为约束仍然为真。
您可以将 mayorEdad 设为布尔值并添加约束 mayorEdad == null
。
或者,如果您不希望根据 mayorEdad 的值触发其他规则,则可以避免 update
。
我是 Drools 和决定 table 的新手。我需要创建一个规则来测试一个人是否 Older/young 使用规则的人年龄。该规则有效,但处于无限循环中。
这是规则,是基本的,年龄> 18 的人年龄大,或者,年龄小于18 的人年龄小。以下是我的 Excel 文件中的 HTML:
<style type="text/css">
table.tableizer-table {
font-size: 10px;
border: 1px solid #CCC;
font-family: Courier New, Courier, monospace;
}
.tableizer-table td {
padding: 4px;
margin: 3px;
border: 1px solid #CCC;
}
.tableizer-table th {
background-color: #DED11F;
color: #FFF;
font-weight: bold;
}
</style>
<table class="tableizer-table">
<thead><tr class="tableizer-firstrow"><th></th><th> </th><th>RuleTable Person</th><th> </th><th> </th><th> </th><th> </th></tr></thead><tbody>
<tr><td> </td><td> </td><td>CONDITION</td><td> </td><td>ACTION</td><td>ACTION</td><td>ACTION</td></tr>
<tr><td> </td><td> </td><td>p:Persona</td><td> </td><td> </td><td> </td><td> </td></tr>
<tr><td> </td><td> </td><td>edad >= </td><td>edad <</td><td>System.out.println( "Age: " + p.getEdad());</td><td>p.setMayorEdad($param);update(p);</td><td>System.out.println( "Older:" +p.isMayorEdad());</td></tr>
<tr><td> </td><td>Person rules</td><td>Status</td><td>Status</td><td>print</td><td>Is older?</td><td>Print ?</td></tr>
<tr><td> </td><td>Older</td><td>18</td><td> </td><td>X</td><td>true</td><td>X</td></tr>
<tr><td> </td><td>Yougn</td><td> </td><td>18</td><td>X</td><td>false</td><td>X</td></tr>
</tbody></table>
My Persona class 是一个简单的 POJO,用于测试决策 table:
人class(静态,在主要class):
public static class Persona{
String nombre;
String apellidoPaterno;
String apellidoMaterno;
int edad;
float salario;
boolean mayorEdad = false;
public Persona() {
super();
}
public Persona(String nombre, String apellidoPaterno, String apellidoMaterno, int edad, float salario) {
super();
this.nombre = nombre;
this.apellidoPaterno = apellidoPaterno;
this.apellidoMaterno = apellidoMaterno;
this.edad = edad;
this.salario = salario;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellidoPaterno() {
return apellidoPaterno;
}
public void setApellidoPaterno(String apellidoPaterno) {
this.apellidoPaterno = apellidoPaterno;
}
public String getApellidoMaterno() {
return apellidoMaterno;
}
public void setApellidoMaterno(String apellidoMaterno) {
this.apellidoMaterno = apellidoMaterno;
}
public int getEdad() {
return edad;
}
public void setEdad(int edad) {
this.edad = edad;
}
public float getSalario() {
return salario;
}
public void setSalario(float salario) {
this.salario = salario;
}
public boolean isMayorEdad() {
return mayorEdad;
}
public void setMayorEdad(boolean mayorEdad) {
this.mayorEdad = mayorEdad;
}
}
我的主要方法是将 drools 6.5 与 JRE 1.7 一起使用:
public static final void main(String[] args) {
try {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-dtables");
Persona p = new Persona();
p.setNombre("Person");
p.setEdad(18);
p.setMayorEdad(true);
kSession.insert(p);
kSession.fireAllRules();
kSession.dispose();
} catch (Throwable t) {
t.printStackTrace();
}
}
这是无限循环的输出。
Age: 4
Older:false
Age: 4
Older:false
Age: 4
Older:false
Age: 4
Older:false
Age: 4
感谢任何提示、link、教程等。
一旦您对事实使用 update()
,评估将再次开始,规则将再次触发,因为约束仍然为真。
您可以将 mayorEdad 设为布尔值并添加约束 mayorEdad == null
。
或者,如果您不希望根据 mayorEdad 的值触发其他规则,则可以避免 update
。