欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Drools 规则引擎 动态读取规则(三)

程序员文章站 2022-05-28 11:16:47
...

在上一篇中,大概说了一下kmodule的配置方式,这种配置方式其实略显复杂,不如通过数据库读取来的简单。

不过,基于kmodule的配置方式,让我们这些刚学习的人,能更好地了解到drools的机智。在有了一定理解的基础上,现在就学习一下如何实现动态读取规则。

动态读取非常简单,不需要kmodule配置文件,也不需要drl文件,只需要把drl文件的内容,保存到比如数据库中,然后使用以下代码即可

KieSession kSession = null;
        try {
            // 从数据库根据code查规则
            String rule = "这里从数据库取出规则内容";

            KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();
            kb.add(ResourceFactory.newByteArrayResource(rule.getBytes("utf-8")), ResourceType.DRL);

            // 检查规则正确性
            KnowledgeBuilderErrors errors = kb.getErrors();
            for (KnowledgeBuilderError error : errors) {
                logger.error("规则文件正确性有误:{}", error);
                return Result.buildFail(null, "规则文件正确性有误");
            }
            InternalKnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
            kBase.addPackages(kb.getKnowledgePackages());

            // 执行规则
            kSession = kBase.newKieSession();
            kSession.insert(fact);
            kSession.fireAllRules();
        } catch (Exception e) {
            logger.error("规则执行异常:{}", e);
        } finally {
            if (null != kSession)
                kSession.dispose();
        }

要注意的是,kbase创建的成本较高,而ksession成本低,所以drools给kbase设计了缓存机制,在第一次启动时可能会耗费一点点时间,第二次调用时,就会从缓存中读取,直接实例化ksession。

相关标签: Linux Drools Java