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.sampledeclare Peopleid:Stringname:StringreturnContent:Stringend rule "rule2"when$people : People( id == "001")thenSystem.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 {//创建PackageBuilderPackageBuilder packgebuilder = new PackageBuilder();//解析编译规则包,可加入多个sourcepackgebuilder.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[]/ObjectruleBase.newStatelessSession().execute(new Object[] {factPeople1});} catch (Throwable t) {t.printStackTrace();}}/** * @param args */public static void main(String[] args) {//构造规则内容字符串,此处可换成从数据库读取规则的各个部分,包括事实、包名称、函数、import内容构造一个完整的规则文件String s = buildRuleSource();//转换成ReaderStringReader source = new StringReader(s); try{executeRules(source);}catch(Throwable t){t.printStackTrace();}}}