簡體   English   中英

使用Java代碼訪問Drools返回的事實對象

[英]Access to Drools returned fact object in Java Code

我有一個通過Guvnor控制台創建的流口水規則,如果滿足條件,該規則將驗證事實並將事實插入工作內存中。 規則是:

    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 

執行規則的Java代碼如下

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);

一切看起來都很不錯,輸出如下:

Hello from Drools
After drools execution
count 2

我似乎找不到找到在我的Java代碼中獲取EligibilityInquiry事實對象並獲取上述規則中設置的屬性的方法( serviceNamestatus )。 我使用了StatefulSession方法。

屬性文件具有通過用戶名和密碼進行基本身份驗證的快照鏈接。 總共有2個事實: EligibilityInquiryEligibility

我對流口水是相當陌生的,對上述任何幫助都將受到贊賞。

(注意:我固定了語句的順序,即錯字(“ XX”),並從輸出中刪除了注釋。不足為奇。)

此摘要假定EligibilityInquiry中也聲明了EligibilityInquiry

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( obj.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 ) );
   }

可能是一個尷尬的富裕階層。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM