drools简介及实例
所属分类 drools
浏览量 1427
6.5.0
drools可根据drl或者xml进行配置,可灵活的调整要运行的规则,处理方法,及规则匹配后的操作,
可以动态生成配置文件
public interface StatelessRuleSession {
void execute(Object object);
void execute(Iterable objects);
}
例子1 drl文件
package dyyx.drools.test
import dyyx.drools.demo1.RuleContext
import dyyx.drools.demo1.RuleHandler
global RuleHandler rule_handler
rule "my first rule"
//规则优先级,优先级大的先执行
salience 2
// 设置no-loop为true ,避免规则重新触发
// no-loop 设置为 false ,对Fact对象的修改 , 调用update ,会重新触发执行 ,简单的set 方法 不会重新触发执行
no-loop true
when
// 查找workingMemory中符合括号内条件的RuleDomain对象 (并不是创建新的对象),然后将其重新命名为domain以供引用
// 条件不满足,不会继续执行
context: RuleContext(name == "tiger")
// 调用规则处理对象
eval(rule_handler.check(context))
then
context.setResult("rule match");
System.out.println("rule match");
end
String drl = Utils.readFromClassPath("drools/demo1.drl", null);
// 创建知识库
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
// 加载drl规则文件
kbuilder.add(ResourceFactory.newReaderResource(new StringReader(drl)),ResourceType.DRL);
// 从知识库中获取规则包
Collection pkgs = kbuilder.getKnowledgePackages();
// 规则引擎添加规则包,添加相应的规则处理逻辑
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(pkgs);
// 创建规则引擎执行会话
StatelessKnowledgeSession session = kbase.newStatelessKnowledgeSession();
RuleHandler ruleHandler = new RuleHandler();
// 设置全局变量, 这里传入的对象类型要与DRL文件中声明的一致
session.setGlobal("rule_handler",ruleHandler);
RuleContext context = new RuleContext();
context.setName("tiger");
context.setAge(9);
// 装载数据对象用于规则判断,执行规则引擎
session.execute(context);
System.out.println(context);
context = new RuleContext();
context.setName("tiger");
context.setAge(18);
// 装载数据对象用于规则判断,执行规则引擎
session.execute(context);
System.out.println(context);
context = new RuleContext();
// ruleHandler 不会运行
context.setName("cat");
context.setAge(18);
// 装载数据对象用于规则判断,执行规则引擎
session.execute(context);
System.out.println(context);
例子1 完整代码
https://gitee.com/dyyx/droolsdemo/blob/master/src/main/java/dyyx/drools/demo1/Demo1Main.java
例子2 drl
package com.dyyx.rules
import dyyx.drools.demo2.Product
rule "updateDistcount"
// update 之后不会重新触发执行
no-loop true
salience 2
when
product:Product(discount > 0);
then
product.setDiscount(product.getDiscount() + 1);
System.out.println(product.getDiscount());
// 不调用 update otherRule 不会触发执行
update(product);
end
rule "otherRule"
salience 3
when
product : Product(discount > 1);
then
System.out.println("otherRule run," + product.getDiscount());
end
String drl = Utils.readFromClassPath("drools/demo2.drl", null);
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newReaderResource(new StringReader(drl)),ResourceType.DRL);
Collection pkgs = kbuilder.getKnowledgePackages();
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(pkgs);
StatelessKnowledgeSession session = kbase.newStatelessKnowledgeSession();
Product product = new Product();
// 调用 update 后会重新触发 otherRule 执行 ,otherRule 两次都匹配
product.setDiscount(1.5);
session.execute(product);
System.out.println("****");
// 第一次 otherRule 不匹配 , 更新完discount 后 ,重新触发 otherRule 执行
product.setDiscount(0.5);
session.execute(product);
当第一个规则执行update方法之后,规则otherRule也会被触发执行。
注释掉update方法,规则otherRule则不会被触发。
lock-on-active true 可以控制当前的规则只会被执行一次,
一个规则的重复执行不一定是本身触发的,也可能是其他规则触发的,这个是no-loop的加强版
例子2 完整代码
https://gitee.com/dyyx/droolsdemo/blob/master/src/main/java/dyyx/drools/demo2/Demo2Main.java
上一篇
下一篇
基本的社交礼仪
Cookie Session 和 Token
Timer already cancelled 异常分析
redis单线程为什么还那么快
redis的VM机制
rocketmq知识点