收藏 分销(赏)

Drools5规则引擎开发教程.pdf

上传人:xrp****65 文档编号:5696412 上传时间:2024-11-15 格式:PDF 页数:74 大小:646.54KB 下载积分:10 金币
下载 相关 举报
Drools5规则引擎开发教程.pdf_第1页
第1页 / 共74页
Drools5规则引擎开发教程.pdf_第2页
第2页 / 共74页


点击查看更多>>
资源描述
http:/ 第 1 页 共 74 页 Drools5Drools5Drools5Drools5 规则引擎规则引擎规则引擎规则引擎 开发开发开发开发教程教程教程教程 高杰高杰高杰高杰 上海锐道信息技术有限公司上海锐道信息技术有限公司上海锐道信息技术有限公司上海锐道信息技术有限公司 2009-8-20 http:/ 第 2 页 共 74 页 1.学习前的准备学习前的准备学习前的准备学习前的准备 Drools 是一款基于 Java 的开源规则引擎,所以在使用 Drools 之前需要在开发机器上安装好JDK 环境,Drools5 要求的 JDK 版本要在 1.5 或以上。1.1.开发环境搭建开发环境搭建开发环境搭建开发环境搭建 大多数软件学习的第一步就是搭建这个软件的开发环境,Drools 也不例外。本小节的内容就是介绍如何搭建一个 Drools5 的开发、运行、调试环境。1.1.1.下载开发工具下载开发工具下载开发工具下载开发工具 Drools5 提供了一个基于 Eclipse3.4 的一个 IDE 开发工具,所以在使用之前需要到http:/eclipse.org网 站 下 载 一 个3.4.x版 本 的Eclipse,下 载 完 成 之 后,再 到http:/jboss.org/drools/downloads.html 网站,下载 Drools5 的 Eclipse 插件版 IDE 及 Drools5的开发工具包,如图 1-1 所示。http:/ 第 3 页 共 74 页 图 1-1 除这两个下载包以外,还可以把 Drools5 的相关文档、源码和示例的包下载下来参考学习使用。将下载的开发工具包及 IDE 包解压到一个非中文目录下,解压完成后就可以在Eclipse3.4 上安装 Drools5 提供的开发工具 IDE 了。1.1.2.安装安装安装安装 Drools IDE 打开 Eclipse3.4 所在目录下的 links 目录(如果该目录不存在可以手工在其目录下创建一个 links 目录),在 links 目录下创建一个文本文件,并改名为 drools5-ide.link,用记事本打开该文件,按照下面的版本输入 Drools5 Eclipse Plugin 文件所在目录:path=D:eclipsedrools-5.0-eclipse-all 这个值表示 Drools5 Eclipse Plugin 文件位于 D 盘 eclipse 目录下的 drools-5.0-eclipse-all下面,这里有一点需要注意,那就是 drools-5.0-eclipse-all 文件夹下必须再包含一个 eclipse目录,所有的插件文件都应该位于该eclipse目录之下,接下来要在win dos下重启Eclipse 3.4,检验 Drools5 IDE 是否安装成功。进入 win dos,进入 Eclipes3.4 所在目录,输入 eclipse clean 启动 Eclipse3.4。启动完成http:/ 第 4 页 共 74 页 后打开菜单 Window?Preferences,在弹出的窗口当中如果能在左边导航树中发现 Drools 节点就表示 Drools5 IDE 安装成功了,如图 1-2 所示。图 1-2 IDE 安装完成后,接下来需要对 Drools5 的 IDE 环境进行简单的配置,打开菜单Window?Preferences,在弹出的窗口当中选择左边导航树菜单 Drools?Installed Drools Runtimes 设置 Drools5 IDE 运行时依赖的开发工具包,点击“Add”按钮添加一个开发工具包,如图 1-3 所示。http:/ 第 5 页 共 74 页 图 1-3 图 1-3 当中添加了一个开发工具包,名称为“drools-5.0.0”,对应的工具包目录为 D 盘docabout ruledrools5.xdrools-5.0-bin 目录。添加完成后这样 Drools5 的开发环境就搭好了。下面我们就来利用这个环境编写一个规则看看运行效果。1.2.编写第一个规则编写第一个规则编写第一个规则编写第一个规则 1.3.规则的编译与运行规则的编译与运行规则的编译与运行规则的编译与运行 在 Drools 当中,规则的编译与运行要通过 Drools 提供的各种 API 来实现,这些 API 总体来讲可以分为三类:规则编译、规则收集和规则的执行。完成这些工作的 API 主要有http:/ 第 6 页 共 74 页 KnowledgeBuilder、KnowledgeBase、StatefulKnowledgeSession、StatelessKnowledgeSession、等,它们起到了对规则文件进行收集、编译、查错、插入 fact、设置 global、执行规则或规则流等作用,在正式接触各种类型的规则文件编写方式及语法讲解之前,我们有必要先熟悉一下这些 API 的基本含义及使用方法。1.3.1.KnowledgeBuilder 规则编写完成之后,接下来的工作就是在应用的代码当中调用这些规则,利用这些编写好的规则帮助我们处理业务问题。KnowledgeBuilder 的作用就是用来在业务代码当中收集已经编写好的规则,然后对这些规则文件进行编译,最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用。KnowledgeBuilder 在编译规则的时候可以通过其提供的 hasErrors()方法得到编译规则过程中发现规则是否有错误,如果有的话通过其提供的 getErrors()方法将错误打印出来,以帮助我们找到规则当中的错误信息。创建 KnowledgeBuilder 对象使用的是 KnowledgeBuilderFactory的 newKnowledgeBuilder方法。代码清单 1-1 就演示了 KnowledgeBuilder 的用法。代码清单 1-1 package test;import java.util.Collection;import org.drools.builder.KnowledgeBuilder;import org.drools.builder.KnowledgeBuilderFactory;import org.drools.builder.ResourceType;import org.drools.definition.KnowledgePackage;import org.drools.io.ResourceFactory;public class Test public static void main(String args)KnowledgeBuilder kbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();kbuilder.add(ResourceFactory.newClassPathResource(test.drl,Test.class),ResourceType.DRL);Collection kpackage=kbuilder.getKnowledgePackages();/产生规则包的集合 http:/ 第 7 页 共 74 页 通过 KnowledgeBuilder 编译的规则文件的类型可以有很多种,如.drl 文件、.dslr 文件或一个 xls 文件等。产生的规则包可以是具体的规则文件形成的,也可以是规则流(rule flow)文件形成的,在添加规则文件时,需要通过使用 ResourceType 的枚举值来指定规则文件的类型;同时在指定规则文件的时候 drools 还提供了一个名为 ResourceFactory 的对象,通过该对象可以实现从 Classpath、URL、File、ByteArray、Reader 或诸如 XLS 的二进制文件里添加载规则。在规则文件添加完成后,可以通过使用 hasErrors()方法来检测已添加进去的规则当中有没有错误,如果不通过该方法检测错误,那么如果规则当中存在错误,最终在使用的时候也会将错误抛出。代码清单 1-2 就演示了通过 KnowledgeBuilder 来检测规则当中有没有错误。代码清单 1-2 package test;import java.util.Collection;import java.util.Iterator;import org.drools.builder.KnowledgeBuilder;import org.drools.builder.KnowledgeBuilderErrors;import org.drools.builder.KnowledgeBuilderFactory;import org.drools.builder.ResourceType;import org.drools.definition.KnowledgePackage;import org.drools.io.ResourceFactory;public class Test public static void main(String args)KnowledgeBuilder kbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();kbuilder.add(ResourceFactory.newClassPathResource(test.drl,Test.class),ResourceType.DRL);if(kbuilder.hasErrors()System.out.println(规则中存在错误,错误消息如下:);KnowledgeBuilderErrors kbuidlerErrors=kbuilder.getErrors();for(Iterator iter=kbuidlerErrors.iterator();iter.hasNext();)System.out.println(iter.next();Collection kpackage=kbuilder.getKnowledgePackages();/产生规则包的集合 http:/ 第 8 页 共 74 页 后面随着介绍的深入我们还会看到 KnowledgeBuilder 的一些其它用法。1.3.2.KnowledgeBase KnowledgeBase 是 Drools 提供的用来收集应用当中知识(knowledge)定义的知识库对象,在一个 KnowledgeBase 当中可以包含普通的规则(rule)、规则流(rule flow)、函数定义(function)、用户自定义对象(type model)等。KnowledgeBase 本身不包含任何业务数据对象(fact 对象,后面有相应章节着重介绍 fact 对象),业务对象都是插入到由 KnowledgeBase产生的两种类型的session对象当中(StatefulKnowledgeSession和StatelessKnowledgeSession,后面会有对应的章节对这两种类型的对象进行介绍),通过 session 对象可以触发规则执行或开始一个规则流执行。创建一个 KnowledgeBase 要通过 KnowledgeBaseFactory 对象提供的 newKnowledgeBase()方法来实现,这其中创建的时候还可以为其指定一个 KnowledgeBaseConfiguration 对象,KnowledgeBaseConfiguration 对象是一个用来存放规则引擎运行时相关环境参数定义的配置对象,代码清单 1-3 演示了一个简单的 KnowledgeBase 对象的创建过程。代码清单 1-3 package test;import org.drools.KnowledgeBase;import org.drools.KnowledgeBaseFactory;public class Test public static void main(String args)KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase();代 码 清 单1-4演 示 了 创 建KnowledgeBase过 程 当 中,使 用 一 个KnowledgeBaseConfiguration 对象来设置环境参数。代码清单 1-4 package test;import org.drools.KnowledgeBase;import org.drools.KnowledgeBaseConfiguration;import org.drools.KnowledgeBaseFactory;http:/ 第 9 页 共 74 页 public class Test public static void main(String args)KnowledgeBaseConfiguration kbConf=KnowledgeBaseFactory.newKnowledgeBaseConfiguration();kbConf.setProperty(org.drools.sequential,true);KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase(kbConf);从代码清单 1-4 中可以看到,创建一个 KnowledgeBaseConfiguration 对象的方法也是使用 KnowldegeBaseFactory,使用的是其提供的 newKnowledgeBaseConfiguration()方法,该方法创建好的 KnowledgeBaseConfiguration 对象默认情况下会加载 drools-core-5.0.1.jar 包下META-INF/drools.default.rulebase.conf 文件里的规则运行环境配置信息,加载完成后,我们可以在代码中对这些默认的信息重新赋值,以覆盖加载的默认值,比如这里我们就把org.drools.sequential 的值修改为 true,它的默认值为 false。除了这种方式创建 KnowledgeBaseConfiguration 方法之外,我们还可以为其显示的指定一个 Properties 对象,在该对象中设置好需要覆盖默认值的相关属性的值,然后再通过newKnowledgeBaseConfiguration(Properties prop,ClassLoader loader)方 法 创 建 一 个KnowledgeBaseConfiguration 对象。该方法方法当中第一个参数就是我们要设置的 Properties对象,第二个参数用来设置加载 META-INF/drools.default.rulebase.conf 文件的 ClassLoader,因为该文件在 ClassPath 下,所以采用的是 ClassLoader 方法进行加载,如果不指定这个参数,那 么 就 取 默 认 的ClassLoader对 象,如 果 两 个 参 数 都 为null,那 么 就 和newKnowledgeBaseConfiguration()方法的作用相同了,代码清单代码清单 1-5 演示了这种用法。代码清单 1-5 package test;import java.util.Properties;import org.drools.KnowledgeBase;import org.drools.KnowledgeBaseConfiguration;import org.drools.KnowledgeBaseFactory;public class Test public static void main(String args)http:/ 第 10 页 共 74 页 Properties properties=new Properties();properties.setProperty(org.drools.sequential,true);KnowledgeBaseConfiguration kbConf=KnowledgeBaseFactory.newKnowledgeBaseConfiguration(properties,null);KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase(kbConf);用来设置默认规则运行环境文件 drools.default.rulebase.conf 里面所涉及到的具体项内容如代码清单 1-6 所示:代码清单 1-6 drools.maintainTms=drools.assertBehaviour=drools.logicalOverride=drools.sequential=drools.sequential.agenda=drools.removeIdentities=drools.shareAlphaNodes=drools.shareBetaNodes=drools.alphaNodeHashingThreshold=positeKeyDepth=drools.indexLeftBetaMemory=drools.indexRightBetaMemory=drools.consequenceExceptionHandler=drools.maxThreads=drools.multithreadEvaluation=在后面的内容讲解过程当中,对于代码清单 1-6 里列出的属性会逐个涉及到,这里就不再多讲了。KnowledgeBase 创建完成之后,接下来就可以将我们前面使用 KnowledgeBuilder 生成的KnowledgePackage 的集合添加到 KnowledgeBase 当中,以备使用,如代码清单 1-7 所示。代码清单 1-7 package test;import java.util.Collection;http:/ 第 11 页 共 74 页 import org.drools.KnowledgeBase;import org.drools.KnowledgeBaseConfiguration;import org.drools.KnowledgeBaseFactory;import org.drools.builder.KnowledgeBuilder;import org.drools.builder.KnowledgeBuilderFactory;import org.drools.builder.ResourceType;import org.drools.definition.KnowledgePackage;import org.drools.io.ResourceFactory;public class Test public static void main(String args)KnowledgeBuilder kbuilder=KnowledgeBuilderFactory .newKnowledgeBuilder();kbuilder.add(ResourceFactory.newClassPathResource(test.drl,Test.class),ResourceType.DRL);Collection kpackage=kbuilder.getKnowledgePackages();KnowledgeBaseConfiguration kbConf=KnowledgeBaseFactory .newKnowledgeBaseConfiguration();kbConf.setProperty(org.drools.sequential,true);KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase(kbConf);kbase.addKnowledgePackages(kpackage);/将KnowledgePackage集合添加到KnowledgeBase当中 1.3.3.StatefulKnowledgeSession 规则编译完成之后,接下来就需要使用一个 API 使编译好的规则包文件在规则引擎当中运行起来。在 Drools5 当中提供了两个对象与规则引擎进行交互:StatefulKnowledgeSession和 StatelessKnowledgeSession,本小节当中要介绍的是 StatefulKnowledgeSession 对象,下面的一节将对 StatelessKnowledgeSession 对象进行讨论。StatefulKnowledgeSession 对象是一种最常用的与规则引擎进行交互的方式,它可以与规则引擎建立一个持续的交互通道,在推理计算的过程当中可能会多次触发同一数据集。在用户的代码当中,最后使用完 StatefulKnowledgeSession 对象之后,一定要调用其 dispose()方http:/ 第 12 页 共 74 页 法以释放相关内存资源。StatefulKnowledgeSession 可以接受外部插入(insert)的业务数据也叫 fact,一个fact 对象通常是一个普通的 Java 的 POJO,一般它们会有若干个属性,每一个属性都会对应getter 和 setter 方法,用来对外提供数据的设置与访问。一般来说,在 Drools 规则引擎当中,fact 所承担的作用就是将规则当中要用到的业务数据从应用当中传入进来,对于规则当中产生的数据及状态的变化通常不用 fact 传出。如果在规则当中需要有数据传出,那么可以通过在 StatefulKnowledgeSession 当中设置 global 对象来实现,一个 global 对象也是一个普通的Java 对象,在向 StatefulKnowledgeSession 当中设置 global 对象时不用 insert 方法而用setGlobal 方法实现。创建一个 StatefulKnowledgeSession 要通过 KnowledgeBase 对象来实现,下面的代码清单 1-8 就演示了 StatefulKnowledgeSession 的用法:代码清单 1-8 package test;import java.util.Collection;import org.drools.KnowledgeBase;import org.drools.KnowledgeBaseConfiguration;import org.drools.KnowledgeBaseFactory;import org.drools.builder.KnowledgeBuilder;import org.drools.builder.KnowledgeBuilderFactory;import org.drools.builder.ResourceType;import org.drools.definition.KnowledgePackage;import org.drools.io.ResourceFactory;import org.drools.runtime.StatefulKnowledgeSession;public class Test public static void main(String args)KnowledgeBuilder kbuilder=KnowledgeBuilderFactory .newKnowledgeBuilder();kbuilder.add(ResourceFactory.newClassPathResource(test.drl,Test.class),ResourceType.DRL);Collection kpackage=kbuilder.getKnowledgePackages();KnowledgeBaseConfiguration kbConf=KnowledgeBaseFactory .newKnowledgeBaseConfiguration();kbConf.setProperty(org.drools.sequential,true);http:/ 第 13 页 共 74 页 KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase(kbConf);kbase.addKnowledgePackages(kpackage);/将KnowledgePackage集合添加到KnowledgeBase当中 StatefulKnowledgeSession statefulKSession=kbase.newStatefulKnowledgeSession();statefulKSession.setGlobal(globalTest,new Object();/设置一个global对象 statefulKSession.insert(new Object();/插入一个fact对象 statefulKSession.fireAllRules();statefulKSession.dispose();代码清单 1-8 当中同时也演示了规则完整的运行处理过程,可以看到,它的过程是首先需要通过使用KnowledgeBuilder将相关的规则文件进行编译,产生对应的KnowledgePackage集合,接下来再通过 KnowledgeBase 把产生的 KnowledgePackage 集合收集起来,最后再产生 StatefulKnowledgeSession 将规则当中需要使用的 fact 对象插入进去、将规则当中需要用到的 global 设置进去,然后调用 fireAllRules()方法触发所有的规则执行,最后调用 dispose()方法将内存资源释放。1.3.4.StatelessKnowledgeSession StatelessKnowledgeSession 的作用与 StatefulKnowledgeSession 相仿,它们都是用来接收业务数据、执行规则的。事实上,StatelessKnowledgeSession 对 StatefulKnowledgeSession 做了包装,使得在使用 StatelessKnowledgeSession 对象时不需要再调用 dispose()方法释放内存资源了。因为 StatelessKnowledgeSession 本身所具有的一些特性,决定了它的使用有一定的局限性。在使用 StatelessKnowledgeSession 时不能进行重复插入 fact 的操作、也不能重复的调用fireAllRules()方法来执行所有的规则,对应这些要完成的工作在 StatelessKnowledgeSession当中只有 execute()方法,通过这个方法可以实现插入所有的 fact 并且可以同时执行所有的规则或规则流,事实上也就是在执行 execute()方法的时候就在 StatelessKnowledgeSession内部执行了 insert()方法、fireAllRules()方法和 dispose()方法。代码清单 1-9 演示了 StatelessKnowledgeSession 对象的用法。http:/ 第 14 页 共 74 页 代码清单 1-9 package test;import java.util.ArrayList;import java.util.Collection;import org.drools.KnowledgeBase;import org.drools.KnowledgeBaseConfiguration;import org.drools.KnowledgeBaseFactory;import org.drools.builder.KnowledgeBuilder;import org.drools.builder.KnowledgeBuilderFactory;import org.drools.builder.ResourceType;import org.drools.definition.KnowledgePackage;import org.drools.io.ResourceFactory;import org.drools.runtime.StatelessKnowledgeSession;public class Test public static void main(String args)KnowledgeBuilder kbuilder=KnowledgeBuilderFactory .newKnowledgeBuilder();kbuilder.add(ResourceFactory.newClassPathResource(test.drl,Test.class),ResourceType.DRL);Collection kpackage=kbuilder.getKnowledgePackages();KnowledgeBaseConfiguration kbConf=KnowledgeBaseFactory .newKnowledgeBaseConfiguration();kbConf.setProperty(org.drools.sequential,true);KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase(kbConf);kbase.addKnowledgePackages(kpackage);/将KnowledgePackage集合添加到KnowledgeBase当中 StatelessKnowledgeSession statelessKSession=kbase.newStatelessKnowledgeSession();ArrayList list=new ArrayList();list.add(new Object();list.add(new Object();statelessKSession.execute(list);代 码 清 单 1-9 当 中,通 过 新 建 了 一 个 ArrayList 对 象,将 需 要 插 入 到http:/ 第 15 页 共 74 页 StatelessKnowledgeSession 当中的对象放到这个 ArrayList 当中,将这个 ArrayList 作为参数传给 execute()方法,这样在 StatelessKnowledgeSession 内部会对这个 ArrayList 进行迭代,取出其中的每一个 Element,将其作为 fact,调用 StatelessKnowledgeSession 对象内部的StatefulKnowledgeSession对 象 的insert()方 法 将 产 生 的fact逐 个 插 入 到StatefulKnowledgeSession 当中,然后调用 StatefulKnowledgeSession 的 fireAllRules()方法,最后执行 dispose()方法释放内存资源。在代码清单1-9当中,如果我们要插入的fact就是这个ArrayList而不是它内部的Element那该怎么做呢?在StatelessKnowledgeSession当中,还提供了execute(Command cmd)的方法,在该方法中通过 CommandFactory 可以创建各种类型的 Command,比如前面的需求要直接将这个 ArrayList 作为一个 fact 插入,那么就可以采用 CommandFactory.newInsert(Object obj)来实现,代码清单 1-9 当中 execute 方法可做如代码清单 1-10 所示的修改。代码清单 1-10 statelessKSession.execute(CommandFactory.newInsert(list);如 果 需 要 通 过StatelessKnowledgeSession设 置global的 话,可 以 使 用CommandFactory.newSetGlobal(“key”,Object obj)来实现;如果即要插入若干个 fact,又要设置相关的 global,那么可以将 CommandFactory 产生的 Command 对象放在一个 Collection 当中,然后再通过 CommandFactory.newBatchExecution(Collection collection)方法实现。代码清单 1-11 演示了这种做法。代码清单 1-11 package test;import java.util.ArrayList;import java.util.Collection;import org.drools.KnowledgeBase;import org.drools.KnowledgeBaseConfiguration;import org.drools.KnowledgeBaseFactory;import org.drools.builder.KnowledgeBuilder;import org.drools.builder.KnowledgeBuilderFactory;import org.drools.builder.ResourceType;import mand.Command;import mand.CommandFactory;import org.drools.definition.KnowledgePackage;import org.drools.io.ResourceFactory;import org.drools.runtime.StatelessKnowledgeSession;http:/ 第 16 页 共 74 页 public class Test public static void main(String args)KnowledgeBuilder kbuilder=KnowledgeBuilderFactory .newKnowledgeBuilder();kbuilder.add(ResourceFactory.newClassPathResource(test.drl,Test.class),ResourceType.DRL);Collection kpackage=kbuilder.getKnowledgePackages();KnowledgeBaseConfiguration kbConf=KnowledgeBaseFactory .newKnowledgeBaseConfiguration();kbConf.setProperty(org.drools.sequential,true);KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase(kbConf);kbase.addKnowledgePackages(kpackage);/将KnowledgePackage集合添加到KnowledgeBase当中 StatelessKnowledgeSession statelessKSession=kbase.newStatelessKnowledgeSession();ArrayList list=new ArrayList();
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 环境建筑 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服