规则引擎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满足一条规则后不再执行其他规则的解决方案
下一篇: Drools 7.X 动态加载规则
推荐阅读
-
【Drools】动态规则引擎使用和配置(SpringBoot集成Drools)
-
规则引擎Drools使用讲解 第六篇 Drools 指定规则运行
-
规则引擎Drools使用 第十二篇 Drools 的高级语法之RHS加强
-
规则引擎Drools使用讲解 第五篇 Drools内置方法
-
规则引擎Drools使用讲解 第三篇Drools规则引擎简单使用
-
规则引擎Drools使用 第九篇 Drools 的高级语法之query使用
-
规则引擎Drools使用 第十篇 Drools 的高级语法之function使用
-
规则引擎Drools使用 第十五篇 Spring Boot整合Drools
-
规则引擎Drools使用 第十六篇 动态加载drools规则文件
-
drools实现动态加载更新指定规则文件