在Java代码中访问Drools返回的事实对象
我有一个通过Guvnor控制台创建的drools规则,并且规则validation并在满足条件时将事实插入工作内存。 规则是:
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
事实对象并获取上面规则中设置的属性( serviceName
和status
)。 我使用了StatefulSession
方法。
属性文件具有通过用户名和密码进行基本身份validation的快照链接。 共有2个事实: EligibilityInquiry
和Eligibility
。
我对drools相当新,对此有任何帮助表示赞赏。
(注意:我修正了语句的顺序,拼写错误(“XX”)并从输出中删除了注释。不那么惊讶。)
此片段假定EligibilityInquiry
也在DRL中声明。
FactType eligInqFactType = ruleBase.getFactType("mortgages", "EligibilityInquiry"); Class> eligInqClass = eligInqFactType.getFactClass(); ObjectFilter filter = new FilterByClass( eligInqClass ); Collection
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
,该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 ) ); }
可能是一个尴尬的尴尬。