2017-04-21 75 views
0

我是新来的流口水和kie服务器。我遇到了如何通过解雇规则RHS(然后是行动)在工作记忆中插入新事实的问题,然后通过这些动态的事实激活其他规则。Drools规则插入新的事实并激发其他规则动态

我期望的是,当BaseFeature从外部插入工作内存并激活RuleOne内部的RuleOne时,“然后”它会插入新的事实RuleResult,并期望激活RuleTwo,但它不会激活RuleTwo,只是RuleOne被激活了,是我做错了什么?

这里我有两个规则和事实的集合:

事实定义:

public class AppResult implements java.io.Serializable 
{ 
    static final long serialVersionUID = 1L; 

    private java.lang.String key; 
    private java.lang.String value; 

    //getters and setters ... 
} 


public class BaseFeature implements java.io.Serializable 
{ 

    static final long serialVersionUID = 1L; 

    private int age; 

    //getters and setters ... 
} 

public class RuleResult implements java.io.Serializable 
{ 

    static final long serialVersionUID = 1L; 

    private java.lang.String ruleName; 
    private java.lang.Long score; 
    private boolean state; 

    //getters and setters ... 
} 

规则定义:

rule "RuleOne" 
    dialect "mvel" 
    salience 100 
    no-loop true 
    lock-on-active true 
    when 
     $b : BaseFeature(age < 22 || age > 40) 
    then 
     RuleResult $r = new RuleResult(); 
     $r.setRuleName("RuleOne"); 
     $r.setState(false); 
     insertLogical($r); 
end 

rule "RuleTwo" 
    dialect "mvel" 
    no-loop false 
    lock-on-active true 
    salience 10 
    when 
     $r : RuleResult(ruleName == "RuleOne" , state == false) 
     $a : AppResult() 
    then 
     $a.setKey("PASS"); 
     $a.setValue("false"); 
end 

如何实现解雇的规则中插入新的事实和解雇其他规则动态? 提前致谢!

我使用纪伊 - 服务器(6.5最终)进行测试,和POST和效应初探如下:

POST:

{ 
    "lookup": "RuleChainTestStateless", 
    "commands": [ 
    { 
     "insert": { 
      "return-object": false, 
      "object": { 
       "com.qf.rulechaintest.BaseFeature": { 
        "age": "10" 
       } 
      } 
     } 
    }, 

    { 
     "insert": { 
      "return-object": true, 
      "out-identifier": "AppResult", 
      "object": { 
       "com.qf.rulechaintest.AppResult": { 

       } 
      } 
     } 
    }, 
    { 
     "fire-all-rules": "" 
    }, 
    { 
      "get-objects":{ 
       "out-identifier":"allFactsInWrokingMemory" 
      } 
    } 

    ] 
} 

REPONSE:

{ 
    "type": "SUCCESS", 
    "msg": "Container RuleChainTest1.1 successfully called.", 
    "result": { 
    "execution-results": { 
     "results": [ 
     { 
      "key": "", 
      "value": 1 
     }, 
     { 
      "key": "AppResult", 
      "value": { 
      "com.qf.rulechaintest.AppResult": { 
       "key": null, 
       "value": null 
      } 
      } 
     }, 
     { 
      "key": "allFactsInWrokingMemory", 
      "value": [ 
      { 
       "com.qf.rulechaintest.BaseFeature": { 
       "age": 10 
       } 
      }, 
      { 
       "com.qf.rulechaintest.AppResult": { 
       "key": null, 
       "value": null 
       } 
      }, 
      { 
       "com.qf.rulechaintest.RuleResult": { 
       "ruleName": "RuleOne", 
       "score": null, 
       "state": false 
       } 
      } 
      ] 
     } 
     ], 
     "facts": [ 
     { 
      "key": "AppResult", 
      "value": { 
      "org.drools.core.common.DefaultFactHandle": { 
       "external-form": "0:2:1542374590:1542374590:2:DEFAULT:NON_TRAIT:com.qf.rulechaintest.AppResult" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

注意,反应:

"com.qf.rulechaintest.AppResult": { 
       "key": null, 
       "value": null 
      } 

它应该是什么:

"com.qf.rulechaintest.AppResult": { 
        "key": "PASS", 
        "value": "false" 
       } 

回答

0

如果你不知道这些规则属性的目的,你应该阅读文档。然后,我想,你会意识到你可以删除它们。

salience 100 or 10 
no-loop true or false 
lock-on-active true 
+0

我kown这个属性,如果与 “火的所有规则” 的CMD :“”,kie-server运行在无限循环中,如果我用cmd“fire-all-rules”更改它:{“max”:100,“out-identifier”:“brms”},它按预期运行 –

+0

如果在一个循环中运行,你没有显示你实际使用的代码。 – laune

0

尝试使用更新功能 “

然后

RuleResult $r = new RuleResult(); 
    $r.setRuleName("RuleOne"); 
    $r.setState(false); 
    update ($r);