我对流口水还很陌生,可能正在做一些非常愚蠢的事情。问题是,出于某种原因,我的口水规则没有被解雇。使用的drools版本为5.4
如果有帮助,当我转换回Stateless知识点会话
并使用执行方法来触发规则时,规则会触发。但是,我需要使用AgendaFilter
来过滤规则,并且我了解Stateless知识点会话
还不支持议程过滤器。作为第一步,我只是将会话翻转到Stateful知识点会话
,插入事实并触发所有规则。
不得不谦恭地说,在过去几天里,我在这件事上伤了头。太糟糕了,文档对drools来说不是那么友好(我参考了官方文档和用户指南)。
下面引用了规则验证器代码和Spring工厂bean,我用它从规则文件加载知识。一、 就个人而言,FactoryBean没有任何问题。任何指示都会有很大帮助。
规则验证器。Java语言
StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession();
ksession.setGlobal("validationReport", validationReport);
ksession.setGlobal("simpleCache", simpleCache);
ksession.setGlobal("ruleValidator", this);
ksession.insert(allClientDetails); //this is a list of ClientDetails objects (facts)
ksession.fireAllRules();
ksession.dispose();
return validationReport;
知识库工厂。Java语言
import java.io.IOException;
import java.util.Map;
import org.apache.log4j.Logger;
import org.drools.KnowledgeBase;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.Resource;
import org.drools.io.ResourceFactory;
import org.springframework.beans.factory.FactoryBean;
public class KnowledgeBaseFactory implements FactoryBean<KnowledgeBase> {
private static Logger logger=Logger.getLogger(KnowledgeBaseFactory.class);
private KnowledgeBase knowledgeBase;
public KnowledgeBaseFactory(Map<String,ResourceType> resourceMap) throws IOException {
logger.debug("Resource Map : "+resourceMap);
final KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
for (Map.Entry<String, ResourceType> eachRuleResource:resourceMap.entrySet()){
knowledgeBuilder.add(ResourceFactory.newClassPathResource(eachRuleResource.getKey()),eachRuleResource.getValue());
}
if (knowledgeBuilder.hasErrors()){
logger.error(knowledgeBuilder.getErrors().toString());
throw new RuntimeException(knowledgeBuilder.getErrors().toString());
}
knowledgeBase = knowledgeBuilder.newKnowledgeBase();
knowledgeBase.addKnowledgePackages(knowledgeBuilder.getKnowledgePackages());
}
@Override
public KnowledgeBase getObject() throws Exception {
return knowledgeBase;
}
@Override
public Class<?> getObjectType() {
return knowledgeBase.getClass();
}
@Override
public boolean isSingleton() {
return true;
}
}
谢谢你的提示@Nim
终于明白了。我应该正确阅读API文档
显然,我在无状态知识会话中使用了重载的执行方法,该方法遍历了我的所有事实,并针对每个事实应用规则。
然而,对于StatefulKnowledgeSession,我应该事先迭代并逐一插入事实。然后,我可以取消规则。
在StatefulKnowledgeSession中没有插入(Iterable)方法的任何原因。
我是Drools Fusion的新手,我想知道为什么我的规则不总是被取消。我用的是Drools 6.3。以下是我要插入的事件: 这是我的规则文件: 这是我的输出: 我预计我的规则将触发2次,并给出以下输出: 我可能忽略了一些事情,但我没有找到关于我的问题的太多信息。有人能解释一下这里到底发生了什么吗?非常感谢。
我的问题是: 在Drools规则中,有没有一种方法可以拦截“成功”事件?为了更好地解释。。。有一种方法可以在规则的所有条件都为真时调用侦听器? 注意:我不想设置一个全局对象(在会话上)来管理规则的“然后”子句中的这个条件。 我正在寻找一个已经在Drools上实现的解决方案 规则示例
谢谢
我正在向drools规则引擎插入数据,但我无法理解它是如何处理插入的数据的。插入数据的代码是:
我们使用的是Drools Planner 5.4.0。我们希望对java应用程序进行概要分析,以了解是否可以提高性能。是否有一种方法可以描述一个规则需要评估多少时间?我们使用了很多eval(....)我们的“平均每秒计算次数”接近37。删除所有eval(...)我们的“平均每秒计算次数”保持不变。
我最近开始研究口水。我只是设计了一个简单的应用程序来更好地理解它。 谢谢。