2017-04-21 91 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);