【问题标题】:Drools infinite loop in decision table在决策表中流口水无限循环
【发布时间】:2017-08-25 18:43:54
【问题描述】:

我是 Drools 和决策表的新手。我需要创建一个规则来使用规则的人年龄来测试一个人是否是老年人/年轻人。该规则有效,但处于无限循环中。

这是规则,是基本的,人年龄 > 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>&nbsp;</th><th>RuleTable Person</th><th>&nbsp;</th><th>&nbsp;</th><th>&nbsp;</th><th>&nbsp;</th></tr></thead><tbody>
 <tr><td>&nbsp;</td><td>&nbsp;</td><td>CONDITION</td><td>&nbsp;</td><td>ACTION</td><td>ACTION</td><td>ACTION</td></tr>
 <tr><td>&nbsp;</td><td>&nbsp;</td><td>p:Persona</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
 <tr><td>&nbsp;</td><td>&nbsp;</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>&nbsp;</td><td>Person rules</td><td>Status</td><td>Status</td><td>print</td><td>Is older?</td><td>Print ?</td></tr>
 <tr><td>&nbsp;</td><td>Older</td><td>18</td><td>&nbsp;</td><td>X</td><td>true</td><td>X</td></tr>
 <tr><td>&nbsp;</td><td>Yougn</td><td>&nbsp;</td><td>18</td><td>X</td><td>false</td><td>X</td></tr>
</tbody></table>

我的 Persona 类是一个简单的 POJO,用于测试决策表:

Person 类(静态,在主类中):

  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;
    }



}

我的主要方法,我正在使用带有 JRE 1.7 的 drools 6.5:

    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

感谢任何提示、链接、教程等。

【问题讨论】:

    标签: java jakarta-ee drools rule-engine rule


    【解决方案1】:

    一旦您对事实使用update(),评估就会重新开始,并且规则会再次触发,因为约束仍然为真。

    您可以将 mayorEdad 设为布尔值并添加约束 mayorEdad == null

    如果您不希望根据 mayorEdad 的值触发其他规则,则可以避免使用 update

    【讨论】:

      猜你喜欢
      • 2019-11-16
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多