2014-07-18 41 views
2

我有一個通過Guvnor控制檯創建的drools規則,如果條件滿足,規則將驗證並將事實插入工作內存。規則是:訪問Drools返回Java代碼中的事實對象

1. | rule "EligibilityCheck001" 
    2. |  dialect "mvel" 
    3. |  when 
    4. |   Eligibility(XXX== "XXX" , YYY== "YYY" , ZZZ== "ZZZ" , BBB == "BBB") 
    5. |  then 
    6. |   EligibilityInquiry fact0 = new EligibilityInquiry(); 
    7. |   fact0.setServiceName("ABCD"); 
    8. |   fact0.setMemberStatus(true); 
    9. |   insert(fact0); 
    10. |   System.out.println("Hello from Drools"); 
    11. | end 
執行的規則如下

RuleAgent ruleAgent = RuleAgent.newRuleAgent("/Guvnor.properties"); 
RuleBase ruleBase = ruleAgent.getRuleBase(); 
FactType factType = ruleBase.getFactType("mortgages.Eligibility"); 

Object obj = factType.newInstance(); 
factType.set(obj, "XXX", "XXX"); 
factType.set(obj, "YYY", "YYY"); 
factType.set(obj, "ZZZ", "XXX"); 
factType.set(obj, "BBB", "BBB"); 

WorkingMemory workingMemory = ruleBase.newStatefulSession(); 
workingMemory.insert(obj); 
workingMemory.fireAllRules(); 
System.out.println("After drools execution"); 
long count = workingMemory.getFactCount(); 
System.out.println("count " + count); 

一切看起來偉大與輸出如下

Java代碼:

Hello from Drools 
After drools execution 
count 2 

我似乎無法找到一種方法將EligibilityInquiry事實對象返回到我的Java代碼中,並獲取上述規則(serviceNamestatus)中設置的屬性。我已經使用了StatefulSession的方法。

屬性文件通過用戶名和密碼與基本認證的快照鏈接。總共有2個事實:EligibilityInquiryEligibility

我是相當新的流口水和任何幫助與上述讚賞。

回答

3

(注:我的固定語句的順序,一個錯字(「XX」),除去從輸出的註釋較少的驚喜。)

這段代碼假定EligibilityInquiry也在DRL聲明。

FactType eligInqFactType = ruleBase.getFactType("mortgages", "EligibilityInquiry"); 
Class<?> eligInqClass = eligInqFactType.getFactClass(); 
ObjectFilter filter = new FilterByClass(eligInqClass); 
Collection<Object> eligInqs = workingMemory.getObjects(filter); 

和過濾器是

public class FilterByClass implements ObjectFilter { 
    private Class<?> theClass; 
    public FilterByClass(Class<?> clazz){ 
     theClass = clazz; 
    } 
    public boolean accept(Object object){ 
     return theClass.isInstance(object); 
    } 
} 

您還可以使用一個query,這需要大約相同數量的代碼。

// DRL code 
query "eligInqs" 
    eligInq : EligibilityInquiry() 
end 

// after return from fireAllRules 
QueryResults results = workingMemory.getQueryResults("eligInqs"); 
for (QueryResultsRow row : results) { 
    Object eligInqObj = row.get("eligInq"); 
    System.out.println(eligInqClass.cast(eligInqObj)); 
} 

或者您可以調用workingMemory.getObjects()並迭代集合並檢查每個對象的類。

for(Object obj: workingMemory.getObjects()){ 
    if(eligInqClass.isInstance(eligInqClass)){ 
     System.out.println(eligInqClass.cast(eligInqObj)); 
    } 
} 

或者你可以(有或沒有插入創建EligibilityInquiry對象作爲事實)增加的事實爲global java.util.List eligInqList和迭代,在您的Java代碼。請注意,需要StatefulKnowledgeSession的API(而不是WorkingMemory)。

// Java - prior to fireAllRules 
    StatefulKnowledgeSession kSession() = ruleBase.newStatefulSession(); 

    List<?> list = new ArrayList(); 
    kSession.setGlobal("eligInqList", list); 

    // DRL 
    global java.util.List eligInqList; 

    // in a rule 
    then 
     EligibilityInquiry fact0 = new EligibilityInquiry(); 
     fact0.setServiceName("ABCD"); 
     fact0.setMemberStatus(true); 
     insert(fact0); 
     eligInqList.add(fact0); 
    end 

    // after return from fireAllRules 
    for(Object elem: list){ 
    System.out.println(eligInqClass.cast(elem)); 
    } 

可能是財富的尷尬。

+0

感謝這對新手很好解釋。 – rockstar

+0

感謝您的解釋,但對於同樣的問題,如果我必須通過REST api從Drools Rule Execution Server中檢索fact0,我該怎麼做? – Dminds

+0

@Dminds您是否通過REST API獲得了從Drools Rule Execution Server中檢索fact0的答案。 –