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

规则引擎Drools使用 第十六篇 动态加载drools规则文件

程序员文章站 2022-03-03 15:55:42
...

       前面讲的的都是读取drool文件,然后加载到规则引擎,如果我们的规则是灵活配置的,那么我们的规则如何动态的写到规则引擎中呢,下面介绍下动态读取规则,并加载到规则引擎中。    

       首先我们需要动态拼接规则,将规则拼接为字符串,然后通过  kieHelper.addContent(drl, ResourceType.DRL);将字符串规则配置徐欢欢为DRl格式写入规则引擎。具体怎么使用呢,下面介绍下使用步骤。

  •  首先将规则拼接为String字符串
   private String getDrlString(Rule rule, String express) {
        StringBuffer stringBuffer = new StringBuffer();

        stringBuffer.append("package " + Constant.rulePackage + " ; \n");
        stringBuffer.append("import java.util.List ;\n");
        stringBuffer.append("import com.entity.pojo.Rule ; \n");
        stringBuffer.append("import com.entity.dto.Hidden ;\n");
        stringBuffer.append("import org.jsoup.nodes.Attributes ;  \n");
        stringBuffer.append("global com..service.RuleLogService ruleLogService;  \n");
        stringBuffer.append("global java.util.concurrent.atomic.AtomicBoolean isTrigger ;\n");
        stringBuffer.append("global java.lang.StringBuffer stringBuffer ;\n");
        String rulename =  RuleTypeEnum.getValueByType(rule.getRuleType()) +":"+ rule.getRuleName();
        stringBuffer.append("rule " +'"'+rulename+'"'+ "  \n");
        stringBuffer.append("      salience " + rule.getSalience() + "\n");
        stringBuffer.append("     enabled true \n");
        stringBuffer.append("      no-loop true \n");
        stringBuffer.append("      when \n");
        stringBuffer.append("            $hidden:Hidden(" + express + ") \n");
        stringBuffer.append("     then \n");
        stringBuffer.append("           isTrigger.compareAndSet(false,true);  \n");
        stringBuffer.append("           ruleLogService.saveLogFromRuleName(drools.getRule().getName());  \n");
        stringBuffer.append("end \n \n");

        return stringBuffer.toString();
    }
  • 然后将获取的字符串加载到规则引擎

    public void createKieSessionFromDRL(String drl) {
        kieHelper.addContent(drl, ResourceType.DRL);
        Results results = kieHelper.verify();
        if (results.hasMessages(Message.Level.WARNING, Message.Level.ERROR)) {
            List<Message> messages = results.getMessages(Message.Level.ERROR);
            for (Message message : messages) {
                throw new RuntimeException("解析drools字符串出错:" + message.getText());
            }
        }
    }

这里需要判断你的规则文件是否有语法,语义上的错误,如果存在错误会抛出异常,规则加载失败。

  • 加载成功后获取KieSession
    public KieSession getSession() {
        KieBase kieBase = kieHelper.build();
        KieSession kieSession = kieSession = kieBase.newKieSession();
        kieSession.addEventListener(new MyRuleListenner());
        return kieSession;
    }

之后就是通过KieSession注入Fact,全局变量,然后触发规则了 

 kieSession.setGlobal("isTrigger", isTrigger);
 kieSession.setGlobal("ruleLogService", ruleLogService);
int count = kieSession.fireAllRules(filter);

相关标签: 规则引擎 drools