Drools动态构造规则内容

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();
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值