当前位置: 首页 > 知识库问答 >
问题:

Drools规则不被解雇

况胡媚
2023-03-14

我对流口水还很陌生,可能正在做一些非常愚蠢的事情。问题是,出于某种原因,我的口水规则没有被解雇。使用的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;
    }
}

共有1个答案

缪英锐
2023-03-14

谢谢你的提示@Nim

终于明白了。我应该正确阅读API文档
显然,我在无状态知识会话中使用了重载的执行方法,该方法遍历了我的所有事实,并针对每个事实应用规则。

然而,对于StatefulKnowledgeSession,我应该事先迭代并逐一插入事实。然后,我可以取消规则。

在StatefulKnowledgeSession中没有插入(Iterable)方法的任何原因。

 类似资料:
  • 我是Drools Fusion的新手,我想知道为什么我的规则不总是被取消。我用的是Drools 6.3。以下是我要插入的事件: 这是我的规则文件: 这是我的输出: 我预计我的规则将触发2次,并给出以下输出: 我可能忽略了一些事情,但我没有找到关于我的问题的太多信息。有人能解释一下这里到底发生了什么吗?非常感谢。

  • 我的问题是: 在Drools规则中,有没有一种方法可以拦截“成功”事件?为了更好地解释。。。有一种方法可以在规则的所有条件都为真时调用侦听器? 注意:我不想设置一个全局对象(在会话上)来管理规则的“然后”子句中的这个条件。 我正在寻找一个已经在Drools上实现的解决方案 规则示例

  • 我正在向drools规则引擎插入数据,但我无法理解它是如何处理插入的数据的。插入数据的代码是:

  • 我们使用的是Drools Planner 5.4.0。我们希望对java应用程序进行概要分析,以了解是否可以提高性能。是否有一种方法可以描述一个规则需要评估多少时间?我们使用了很多eval(....)我们的“平均每秒计算次数”接近37。删除所有eval(...)我们的“平均每秒计算次数”保持不变。

  • 我最近开始研究口水。我只是设计了一个简单的应用程序来更好地理解它。 谢谢。