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

       前面讲的的都是读取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);

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员路同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值