当前位置: 首页 > 知识库问答 >
问题:

决策表中的Drools无限循环

益泰平
2023-03-14

我对口水和决策表还不熟悉。我需要创建一个规则,使用规则中的人的年龄来测试一个人是否年长/年轻。该规则在无限循环中工作。

这是规则,是基本的,人的年龄

html lang-html prettyprint-override"><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>

我的角色类是一个简单的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

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

共有1个答案

熊哲圣
2023-03-14

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

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

或者,如果您不期望根据mayorEada的值触发其他规则,您可以避免更新

 类似资料:
  • 当我尝试使用Drools引擎计算保险费时,我有一个潜在的性能/内存瓶颈。 我在我的项目中使用Drools将业务逻辑与java代码分开,我决定也将其用于溢价计算。 我是不是用错了口水 如何以更高性能的方式满足要求 详情如下: 我必须为给定的合同计算保险费。 合约配置有 productCode(来自字典的代码) 合同代码(来自字典的代码) 客户的个人资料(例如年龄、地址) 保险金额(SI) 等等 目前

  • 场景如下: 我有一个java pojo类,具有2个变量和以及适当的getter和setter。我正在使用决策表流,我想要: 条件:当类型设置为“1”时 操作:调用name类的setName setter,并从excel中设置适当的参数 现在,我想在java中访问name的这个集值。 这就是我所做的: Name.java- MainClass.java-这有口水实现!! 决策表e:: http://

  • 我在excel电子表格中有一个drools决策表,其中有两条规则。(此示例已大大简化,我正在使用的示例有更多规则。) 我的目标是让规则自上而下地触发,随后的规则可能取决于早期规则对事实/对象所做的更改。 这个问题有解决办法吗?任何帮助都将不胜感激,谢谢!

  • 我有一个drools决策表,其中包含条件和位置类型 我的excel如下所示 设置参数的代码如下 我按要求提供的excel文件条件对象: 需求级别==$参数位置类型==$参数 当我像上面那样设置时,我得到以下错误: 创建KieBase时出错[消息[id=1,级别=错误,路径=规则.xls,行=8,列=0文本=[错误102]行8:14不匹配的输入'=='在规则“替换规则”中],消息[id=2,级别=错

  • 我很难找到一条我知道有效的规则。drl表单,用于在决策表中工作。 这是我的drl形式的规则: 以下是我在电子表格中尝试的内容: 当我尝试从电子表格中运行规则时,我遇到以下错误: from子句似乎有问题,但我不知道为什么。我尝试了无数次谷歌搜索,这是我唯一能找到的:http://drools-moved.46999.n3.nabble.com/Question-on-excel-decision-t

  • 有人能帮我调试Drools中的决策表吗。对于我们的项目,我们正在创建一个包含1000多条规则的决策表。每当他们在规则中出现错误时,谁的电子表格不工作,也不显示准确的错误在哪里。