package com.sample;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
import org.drools.compiler.DroolsParserException;
import org.drools.compiler.PackageBuilder;
import org.drools.definition.type.FactType;
import org.drools.event.DebugWorkingMemoryEventListener;
import org.drools.rule.Package;
public class DynamicRules {
public static String buildRuleSource(){
//完整的规则内容如下:
/*
package com.sample
declare People
id:String
name:String
returnContent:String
end
rule "rule2"
when
$people : People( id == "001")
then
System.out.println( $people.getName());
end
*/
StringBuffer sb = new StringBuffer();
sb.append("package com.sample");
sb.append("\r\n");
sb.append("declare People");
sb.append("\r\n");
sb.append("id:String");
sb.append("\r\n");
sb.append("name:String");
sb.append("\r\n");
sb.append("end");
sb.append("\r\n");
sb.append("rule \"rule2\"");
sb.append("\r\n");
sb.append("when");
sb.append("\r\n");
sb.append("$People : People( id == \"001\")");
sb.append("\r\n");
sb.append("then");
sb.append("\r\n");
sb.append("System.out.println( $People.getName());");
sb.append("\r\n");
sb.append("end");
//System.out.println(sb.toString());
return sb.toString();
}
public static void executeRules(Reader source) throws DroolsParserException, IOException{
try {
//创建PackageBuilder
PackageBuilder packgebuilder = new PackageBuilder();
//解析编译规则包,可加入多个source
packgebuilder.addPackageFromDrl(source);
//获得已经编译的规则包
Package pkg = packgebuilder.getPackage();
//创建一个规则集
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
//加载已规则包
ruleBase.addPackage(pkg);
//获得规则中需要使用的事实对象,方式:包名.事实名
FactType factType = ruleBase.getFactType("com.sample.People");
//创建一个事实实例
Object factPeople1 = factType.newInstance();
//给事实属性赋值
factType.set(factPeople1, "id", "001");
factType.set(factPeople1, "name", "tom");
//执行规则。方法1,使用StatefulSession,一次只能插入一个事实
//WorkingMemory workingMemory = ruleBase.newStatefulSession();
//workingMemory.addEventListener(new DebugWorkingMemoryEventListener());
//workingMemory.insert(factPeople1);
//workingMemory.fireAllRules();
//执行规则。方法2,使用StatelessSession执行规则
//可传入Collect/Object[]/Object
ruleBase.newStatelessSession().execute(new Object[] {factPeople1});
} catch (Throwable t) {
t.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
//构造规则内容字符串,此处可换成从数据库读取规则的各个部分,包括事实、包名称、函数、import内容构造一个完整的规则文件
String s = buildRuleSource();
//转换成Reader
StringReader source = new StringReader(s);
try{
executeRules(source);
}
catch(Throwable t){
t.printStackTrace();
}
}
}
分享到:
相关推荐
drools动态生成规则文件
Drools7 + Springboot2 动态更新规则。 规则存储到数据库MYSQL,动态从数据库中获取规则进行加载。 运行前请自行修改MYSQL配置
drools从字符串中动态加载规则,通过拼接规则,形成字符串,将原先需要读取.drl文件,变成读取字符串的规则,不需要形成.drl文件,根据需要拼接规则字符串
springboot集成drools实现重新加载规则
基于drools7.9 动态更新rule,需要的可以参考实现,也有一个简单的helloworld程序,入门实例
drools整合apollo实现动态规则引擎,可以在不停服的情况下动态调整规则。无需数据库等存储,自动推送
springboot+drools动态模板引擎结合实例展示,用springboot作为框架集成drools。
9 Drools WorkBench使用9.1 WorkBench基本使用9.2 创建会话9.3 编译并部署9.4 执行代码10 Drools决策表入门11 Drools决策表加强12 Drools决策表整合Springboot和MybatiesPlus13 动态编译Class文件实现Drools规则调用...
1.基于JBOSS RULES(DROOLS) 6.5 开发 2.JAR包精简后只有20个 10.9M 3.动态规则 项目中使用需自己修改为从数据库加载规则
NULL 博文链接:https://haroldxie.iteye.com/blog/1317751
drools-规则语言
jboss drools5.5 案例 规则流完整代码
Drools是Jboss公司旗下一款开源的规则引擎,它完整的实现了Rete 算法;提供了强大的Eclipse Plugin开发支持; 通过使用其中的DSL(Domain Specific Language),可以实现用自然语言方式来描述业务规则,使得业务分析...
从基础讲起,结合应用场景,由浅到深细化讲解drools规则引擎的的相关知识,并结合具体实例,演示功能的使用和注意事项。后面通过搭建具体的项目并结合springboot框架联合使用Drools的相关知识包括决策表的使用,囊括...
NULL 博文链接:https://wangmengbk.iteye.com/blog/2120259
myeclipse安装drools jboss rules规则引擎
3、可以动态修改业务规则,从而快速响应需求变更 4、规则引擎是相对独立的,只关心业务规则,使得业务分析人员也可以参与编辑、维护系统的业务规则 5、减少了硬编码业务规则的成本和风险 6、使用规则引擎提供的...
不关闭服务,修改规则文件条件,使得原来不能通过的条件通过,实现规则的动态加载。
如果对drools还不是特别熟悉的,可以看下 《规则引擎Drools 之 初识drools》这篇文章; 本文源码,github 传送门:https://github.com/vincent9309/drools: 系统架构如下: 二、项目目录结构 三、...
描述Drools规则引擎的相关内容,并讲述java环境下如何集成drools工具实现规则的推理