我对 Drools 很陌生,我已经完成了一些在线找到的教程并阅读了文档。我确信我将要解释的内容有一个我错过的微不足道的解决方案,但无论如何我都会列出来。
我的 drools 文件中有一条规则,并且有一个从文本文件中读取其信息的对象。
代码与此类似:
public static final void main(String[] args) {
try {
ObjectArchive arch = ArchiveFactory.openArchive(new File("dwc.txt"));
Iterator<Object> iter = arch.iteratorDwc();
// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
while(iter.hasNext()) {
Object dwcRecord = iter.next();
ksession.insert(dwcRecord);
}
System.out.println(ksession.getFactCount());
ksession.fireAllRules();
logger.close();
} catch (Throwable t) {
t.printStackTrace();
}
}
private static KnowledgeBase readKnowledgeBase() throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("dwcrules.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error: errors) {
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
我有一个简单的规则文件,它检查所述对象的属性是否不为空,如果为真则打印出该对象。
现在,问题。
如果我添加一个对象(没有 while 循环),则触发规则并且一切正常。但是,如果我将多个对象添加到会话中,然后触发规则,它往往只会抓取最后一个,或者触发但打印出一个空值。
那么,为什么我无法添加多个相同类型的事实呢?或者我错过了什么阻止我对多个事实执行相同的规则?
提前致谢。
编辑:对不起,这是规则:
rule "Scientific Name"
when
dwc : Object(dwc.getScientificName != null)
then
System.out.println(dwc);
end