首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Drools动态结构规则内容

2012-08-07 
Drools动态构造规则内容package com.sampleimport java.io.IOExceptionimport java.io.Readerimport ja

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();}}}

热点排行