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

在上一篇中,大概说了一下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)