2017-04-21 19 views
0

나는 drools와 kie-server를 처음 사용합니다. 나는 해고 된 규칙 RHS (그 다음 action)에 의해 작업 메모리에 새로운 사실을 삽입하는 방법에 관한 문제를 가지고 이러한 동적 insured 사실들에 의해 다른 규칙들을 활성화시킨다.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 

다른 규칙은 동적입니까? 미리 감사드립니다!

나는 테스트 KIE 서버 (최종 6.5)를 사용하여, 아래로 POST와 Reponse 오전 :

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

난 당신이 규칙이 평균 어떤 속성 읽기 (워드 프로세서 [1]에서의 전에 참조)해야한다는 laune에 동의합니다. 나는 당신이 규칙에 락온 (lock-on-active)을 가지고 있기 때문에 그것이라고 생각합니다. 제가 링크 된 문서를보십시오.

[1] https://docs.jboss.org/drools/release/6.5.0.Final/drools-docs/html/ch08.html#d0e9196

+0

Tibor에게 감사, lock-on-active가 제거되고 예상대로 작동합니다. –

0

, "다음

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

"