Drools规则引擎API概述

本文介绍了Drools规则引擎的基本概念,包括规则与事实的定义及其在内存中的存储方式。详细阐述了Drools提供的KnowledgeAPI、FactAPI及ExecutionAPI的使用方法,并通过示例代码展示了如何构建知识库、操作会话以及执行规则。

转载自 http://thinkinside.tk/2013/12/20/drools_API.html

规则引擎中,将知识表达为规则(rules),要分析的情况定义为事实(facts)。二者在内存中的存储分别称为Production Memory和Working Memory。在外围,还会有一个执行引擎(Execution Engine)。

与此对应,规则引擎API也分成三个部分。在Drools中,分别叫做:

Knowledge API: 相关API一般都在org.drools.builder下

Fact API:相关的API一般都在org.drools.command下

Execution API:相关的API都在org.drools.runtime下

Knowledge API

Drools将知识库(KnowledgeBase)作为JSR94中的规则执行集(RuleExecutionSet)。知识库中的知识以包(KnowledgePackage)为单位组合而成。每个包中聚合多个规则(Rule)。

通常,一个包中的内容会在一个或多个资源(Resource)中保存。资源的类型可以有很多种,如.drl 文件、.dslr 文件或 xls 文件等。

规则包还可以从规则流(rule flow) 文件中获取。

KnowledgeBase

与此对应,Drools定义了一组Knowledge API来操作知识库。

KnowledgeBase

构建知识库的一般过程为:

  1. 通过ResourceFactory获取资源。可以从Classpath、URL、File、ByteArray、Reader等输入源中获取
  2. 构建KnowledgeBuilder,将资源添加到KnowledgeBuilder中。KnowledgeBuilder通常由KnowledgeBuilderFactory创建
  3. 从KnowledgeBuilder中获取规则包
  4. 创建KnowledgeBase,可以通过KnowledgeBaseConfiguration定义KnowledgeBase的一些属性,默认的配置位于drools-core-VERSION.jar 包下 META-INF/drools.default.rulebase.conf 文件中
  5. 将规则包添加到KnowledgeBase
  6. 为KnowledgeBase添加KnowledgeBaseEventListener,可以监控KnowledgeBase中的事件

代码示例:

 KnowledgeBase buildKBase(){
        
        Resource res = ResourceFactory.newClassPathResource("hello.drl", Demo.class);
        
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
                .newKnowledgeBuilder();

        kbuilder.add(res,ResourceType.DRL);
        
        //validate
        if (kbuilder.hasErrors()) {
            System.out.println("规则中存在错误,错误消息如下:");
            KnowledgeBuilderErrors kbuidlerErrors = kbuilder.getErrors();
            for (Iterator iter = kbuidlerErrors.iterator(); iter.hasNext();) {
                System.out.println(iter.next());
            }
        }
        
        Collection<KnowledgePackage> kpackages = kbuilder.getKnowledgePackages();
        
        KnowledgeBaseConfiguration kbConf =
                KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); 
        kbConf.setProperty( "org.drools.sequential", "true"); 
        
        //KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase();
        KnowledgeBase kbase =
                KnowledgeBaseFactory.newKnowledgeBase(kbConf);
        
        kbase.addKnowledgePackages(kpackages);
        
        return kbase;
    }

Fact API

要操作Working Memory,首先要建立规则引擎的一个会话。Drools中的有状态会话和无状态会话分别为StatefulKnowledgeSession和StatelessKnowledgeSession,都可以由KnowledgeBase建立。

通过会话可以进行操作Fact对象,执行规则等交互,例如:

KnowledgeBase kbase = buildKBase();
        
StatefulKnowledgeSession statefulKSession=kbase.newStatefulKnowledgeSession();
statefulKSession.setGlobal("globalTest", new Object());

statefulKSession.insert(new Object()); 
statefulKSession.fireAllRules(); 
statefulKSession.dispose();

StatefulKnowledgeSession中,insert()方法、fireAllRules()方法和 dispose()方法是分开执行的,这个过程中可以进行一定的控制, 而StatelessKnowledgeSession不同,在无状态会话中,上述三个方法被合并为execute()方法,不能分开调用。如果要插入多个Fact对象,只能使用集合,比如:

StatelessKnowledgeSession statelessKSession=kbase.newStatelessKnowledgeSession();
ArrayList list=new ArrayList(); 
list.add(new Object()); 
list.add(new Object()); 
statelessKSession.execute(list);

这样的特点决定了,无状态会话适合推演和分析,需要事先知道所有的事实(Fact);而有状态会话可以随时增加事实并进行批评,适合实际应用。

无状态会话中还可以使用execute(Command cmd)方法。比如,如果要在无状态会话中插入一个List,可以用CommandFactory生成一个关于List的Command:

statelessKSession.execute(CommandFactory.newInsert(list));

同样,无状态会话中如果要设置global,也需要使用Command:

ArrayList<Command> list=new ArrayList<Command>(); 

list.add(CommandFactory.newInsert(new Object())); 
list.add(CommandFactory.newInsert(new Object())); 

list.add(CommandFactory.newSetGlobal("key1", new Object())); 
list.add(CommandFactory.newSetGlobal("key2", new Object()));

statelessKSession.execute(CommandFactory.newBatchExecution(list)) ;

Execution API

插入到WorkingMemory中的对象,并不是克隆,而是对原对象的引用。这就意味着引擎中可以改变外部的对象,这是引擎与外部数据交互的一个通道。

此外,insert()方法还会返回一个FactHandler,作为引擎中该Fact对象的一个句柄。

最后,session上可以注册AgendaEventListener、ProcessEventListener和WorkingMemoryEventListener,这也是常用的交互方式。 比如WorkingMemoryEventListener可以监听Fact对象变化的事件:

public interface WorkingMemoryEventListener
    extends
    EventListener {
    void objectInserted(ObjectInsertedEvent event);

    void objectUpdated(ObjectUpdatedEvent event);

    void objectRetracted(ObjectRetractedEvent event);
}
第一章 规则引擎初步了解 5 1 为什么会有规则引擎? 5 2 什么是规则引擎? 5 3 为何要使用规则引擎? 6 3.1 声明式编程 6 3.2逻辑与数据分离 6 3.3 速度及可测量性 6 3.4 知识集中化 6 3.5 工具集成 6 3.6 解释机制 6 3.7易懂的规则 7 4 何时应当使用规则引擎? 7 5 如何使用规则引擎? 7 6 何时不要使用规则引擎 ? 8 7 规则引擎的架构和推理 8 8规则引擎的算法 10 9 Java规则引擎商业产品 10 10 Dools介绍 11 第二章. Drools 规则引擎 11 2.1. 概述 11 2.2. 编制 13 2.3. RuleBase 18 2.4. WorkingMemory 和有状态/无状态Sessions 22 2.5. StatefulSession 28 2.6. StatelessSession 29 2.7. Agenda 31 2.8. Truth Maintenance with Logical Objects 34 2.9. 事件模型(Event Model) 37 2.10. 顺序模式 41 第三章. 安装和设置(Core 与IDE) 42 3.1. 安装和使用 42 3.1.1. 依赖库 42 3.1.2. 运行时(Runtime) 43 3.1.3. 安装IDE (规则工作台) 43 3.2. 从源码进行安装 54 3.3. 源码Checkout 54 3.4. 构建 59 3.4.1. 构建源码 59 3.4.2. 构建使用手册 61 3.5. Eclipse 65 3.5.1. 产生Eclipse项目 65 3.5.2. 导入Eclipse项目 66 3.5.3. 导出IDE插件 71 3.5.4. 构建更新站点 76 第四章. 决策表 78 4.1. 在电子表格中的决策表 78 4.1.1. 何时使用决策表 78 4.1.2. 概述 79 4.1.3. 决策表如何工作 81 4.1.4. 关键字和语法 83 4.1.5. 基于决策表建立并集成电子表格 87 4.1.6. 在决策表中管理业务规则 88 第五章. 规则工作台 (IDE) 89 5.1. Introduction 89 5.1.1. 特性概要 90 5.1.2. 建立规则项目 90 5.1.3. 新建规则向导 92 5.1.4. 规则编辑器 94 5.1.5. 视图 95 5.1.6. 领域规范语言DSL 98 5.1.7. The Rete视图 100 5.1.8. 大容量DRL文件 101 5.1.9. 调试规则 102 第六章. 规则语言 103 6.1. 概述 103 6.1.1. 规则文件 103 6.1.2. 规则的构成 104 6.1.3. 保留字 104 6.2. Comments注释 106 6.2.1. 单行注释 106 6.2.2. 多行注释 106 6.3. Package 107 6.3.1. import 108 6.3.2. expander 108 6.3.3. global全局变量 108 6.4. Function 110 6.5. Rule 111 6.5.1. Rule 属性 112 6.5.2. LHS (when) 条件元素 115 6.5.3. The Right Hand Side (then) 140 6.5.4. 对自动封箱/拆箱以及元数据类型的注解 141 6.6. Query 141 6.7. Domain Specific Languages 领域特定语言 142 6.7.1. 何时使用DSL 142 6.7.2. 编辑与管理DSL 143 6.7.3. 在规则中使用DSL 144 6.7.4. 增加对fact的约束 145 6.7.5. DSL如何工作 146 6.7.6. 从头开始建立DSL 146 6.8. 规则流 147 6.8.1. 设置规则所属的规则流组 148 6.8.2. 简单的规则流 148 6.8.3. 如何建立规则流 148 6.8.4. 在你的应用程序中使用规则流 153 6.9. XML规则语言 153 6.9.1. 何时使用XML 153 6.9.2. XML 格式 154 6.9.3. 遗留的Drools 2.x XML 规则格式 159 6.9.4. Automatic transforming between formats (XML and DRL) 159 第七章:部署和测试 160 7.1. 部署选项 160 7.1.1. 使用RuleAgent部署 160 7.1.2. 使用drl源码部署 161 7.1.3. 在你的classpath中部署规则 161 7.1.4. 可部署的对象RuleBase, Package等等. 161 7.1.5. 部署模式 163 7.1.6. Web Services 166 7.1.7. 未来的构想 166 7.2. 测试 166 7.2.1. 测试框架 166 7.2.2. FIT for Rules – 一种规则测试框架 166 第八章. BRMS (业务规则管理系统) 168 8.1. 简介 168 8.1.1. 什么是BRMS? 169 8.1.2. 特性概要 170 8.2. 管理指南 170 8.2.1. 安装 171 8.2.2. 数据库配置 172 8.2.3. 安全性 173 8.2.4. 数据管理 176 8.3. 体系结构 178 8.3.1. 从源码构建 179 8.3.2. 可重用组件 180 8.3.3. 版本和存储库 180 8.3.4. 贡献 181 8.4. 快速使用指南 181 8.4.1. 快速使用指南 181 8.4.2. BRMS 概念 183 8.4.3. The business user perspective 197 8.4.4. 部署: 将规则与你的应用集成 197 8.5. 例子与教程 200 8.5.1. 保险经济折扣 200 第九章. Java规则引擎API 202 9.1 简介 202 9.2 java规则引擎API体系结构 202 9.3 规则管理API 202 9.4 运行时API 203 9.5 java规则引擎API的安全问题 204 9.6 异常与日志 205 9.7 JSR小结 205 9.8 Dools API 参考 205 9.8.1 简介 205 9.8.2. 如何使用 205 9.8.3. 参考书目 209
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值