`

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();
		}
	}
}
分享到:
评论
1 楼 java_4_ever 2014-01-03  
步骤很清晰,注释很详细 nice!

相关推荐

    Drools规则引擎手册.zip

    Drools提供了多种构造符,如AND、OR、NOT等,以支持复杂条件的组合。此外,Drools还支持规则的优先级和约束,以便控制规则的执行顺序。 集成Drools到你的项目中,可以使用Maven或者Gradle依赖,将其库引入到构建...

    Drools规则引擎应用分析

    当软件需要推理规则或者业务需求发生变化时,可以用来构造复杂的软件系统。 Drools规则引擎的核心是执行推理规则的机制,推理规则是从简单的因果关系声明中解析而来的,通常采用“if-then”格式。每条规则都有一个...

    java规则引擎 -- Drools

    总之,Drools是一个强大且灵活的规则引擎,适用于需要动态调整业务规则的场景,如金融风控、保险索赔审批、医疗诊断等。通过学习和掌握Drools,开发者能够更好地应对复杂的业务逻辑挑战,同时提升代码的可维护性和可...

    drools中Fact的equality modes.doc

    drools 是一个强大的规则引擎,它允许开发人员以声明式的方式定义业务规则。在 drools 中,事实(Fact)是业务逻辑中的实体或对象,它们被插入到工作内存(Working Memory)中,供规则引擎进行匹配和处理。本文将...

    开源规则引擎Pyke研究报告

    ### 开源规则引擎Pyke研究报告知识点详述 ...通过以上内容,我们可以看到Pyke不仅提供了一个灵活且强大的框架来实现规则推理,而且还支持丰富的语法和特性,使其成为一个值得研究和使用的开源规则引擎。

    jboss rule 规则引擎 中文版

    jBoss Rule(现称为Drools)是一个开源规则引擎,基于查尔斯·弗罗姆曼的《产生式规则方法》一书中提到的Rete算法。该引擎支持复杂的事件处理和业务流程管理,使得开发者能够更加灵活地管理和改变业务逻辑。 #### ...

    javadoc.rar

    在 "drl" 这个标签中,DRL(Domain Specific Rule Language)通常指的是 Drools 规则引擎中的领域特定规则语言。Drools 是一个开源的业务规则管理系统,它允许开发人员以声明式的方式编写业务规则。JavaDoc 在这个上...

    工作流各项对比.pdf

    这样,工作流可以在运行时根据规则动态变化,提供更高的灵活性和智能性。 5. BPEL与XPDL BPEL(Business Process Execution Language)是一种XML语言,用于描述业务流程。而XPDL(XML Process Definition Language...

    agutur-开源

    AGUTUR的核心特性在于其使用Drools,这是一个强大的规则引擎,能够根据预定义的规则生成单元测试。这样,开发者可以利用这些规则来定制测试策略,确保测试的全面性和针对性。Drools的灵活性使得测试用例可以根据项目...

    json-logic-eval

    8. **与其他规则引擎的对比**:了解JSON Logic Eval与Drools、OptaPlanner等更复杂规则引擎的区别,理解在何时选择JSON Logic Eval,何时可能需要更强大的解决方案。 9. **最佳实践**:学习如何编写简洁、可读性强...

Global site tag (gtag.js) - Google Analytics