第2页共74页1.学习前的准备学习前的准备学习前的准备学习前的准备Drools是一款基于Java的开源规则引擎,所以在使用Drools之前需要在开发机器上安装好JDK环境,Drools5要求的JDK版本要在1.5或以上。1.1.开发环境搭建开发环境搭建开发环境搭建开发环境搭建大多数软件学习的第一步就是搭建这个软件的开发环境,Drools也不例外。本小节的内容就是介绍如何搭建一个Drools5的开发、运行、调试环境。1.1.1.下载开发工具下载开发工具下载开发工具下载开发工具Drools5提供了一个基于Eclipse3.4的一个IDE开发工具,所以在使用之前需要到,下载完成之后,再到网站,下载Drools5的Eclipse插件版IDE及Drools5的开发工具包,如图1-1所示。除这两个下载包以外,还可以把Drools5的相关文档、源码和示例的包下载下来参考学习使用。将下载的开发工具包及IDE包解压到一个非中文目录下,解压完成后就可以在Eclipse3.4上安装Drools5提供的开发工具IDE了。1.1.2.安装安装安装安装DroolsIDE打开Eclipse3.4所在目录下的links目录(如果该目录不存在可以手工在其目录下创建一个links目录),在links目录下创建一个文本文件,并改名为drools5-ide.link,用记事本打开该文件,按照下面的版本输入Drools5EclipsePlugin文件所在目录:path=D:\\eclipse\\drools-5.0-eclipse-all这个值表示Drools5EclipsePlugin文件位于D盘eclipse目录下的drools-5.0-eclipse-all下面,这里有一点需要注意,那就是drools-5.0-eclipse-all文件夹下必须再包含一个eclipse目录,所有的插件文件都应该位于该eclipse目录之下,接下来要在windos下重启Eclipse3.4,检验Drools5IDE是否安装成功。进入windos,进入Eclipes3.4所在目录,输入eclipse–clean启动Eclipse3.4。启动完成Preferences,在弹出的窗口当中如果能在左边导航树中发现Drools节点就表示Drools5IDE安装成功了,如图1-2所示。图1-2IDE安装完成后,接下来需要对Drools5的IDE环境进行简单的配置,打开菜单WindowPreferences,在弹出的窗口当中选择左边导航树菜单DroolsInstalledDroolsRuntimes设置Drools5IDE运行时依赖的开发工具包,点击“Add…”按钮添加一个开发工具包,如图1-3所示。当中添加了一个开发工具包,名称为“drools-5.0.0”,对应的工具包目录为D盘doc\aboutrule\drools5.x\drools-5.0-bin目录。添加完成后这样Drools5的开发环境就搭好了。下面我们就来利用这个环境编写一个规则看看运行效果。1.2.编写第一个规则编写第一个规则编写第一个规则编写第一个规则1.3.规则的编译与运行规则的编译与运行规则的编译与运行规则的编译与运行在Drools当中,规则的编译与运行要通过Drools提供的各种API来实现,这些API总体来讲可以分为三类:规则编译、规则收集和规则的执行。完成这些工作的API主要有、KnowledgeBase、StatefulKnowledgeSession、StatelessKnowledgeSession、、等,它们起到了对规则文件进行收集、编译、查错、插入fact、设置global、执行规则或规则流等作用,在正式接触各种类型的规则文件编写方式及语法讲解之前,我们有必要先熟悉一下这些API的基本含义及使用方法。1.3.1.KnowledgeBuilder规则编写完成之后,接下来的工作就是在应用的代码当中调用这些规则,利用这些编写好的规则帮助我们处理业务问题。KnowledgeBuilder的作用就是用来在业务代码当中收集已经编写好的规则,然后对这些规则文件进行编译,最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用。KnowledgeBuilder在编译规则的时候可以通过其提供的hasErrors()方法得到编译规则过程中发现规则是否有错误,如果有的话通过其提供的getErrors()方法将错误打印出来,以帮助我们找到规则当中的错误信息。创建KnowledgeBuilder对象使用的是KnowledgeBuilderFactory的newKnowledgeBuilder方法。代码清单1-1就演示了KnowledgeBuilder的用法。代码清单1-1packagetest;importjava.util.Collection;importorg.drools.builder.KnowledgeBuilder;importorg.drools.builder.KnowledgeBuilderFactory;importorg.drools.builder.ResourceType;importorg.drools.definition.KnowledgePackage;importorg.drools.io.ResourceFactory;publicclassTest{publicstaticvoidmain(String[]args){KnowledgeBuilderkbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();kbuilder.add(ResourceFactory.newClassPathResource(test.drl,Test.class),ResourceType.DRL);CollectionKnowledgePackagekpackage=kbuilder.getKnowledgePackages();//产生规则包的集合}}编译的规则文件的类型可以有很多种,如.drl文件、.dslr文件或一个xls文件等。产生的规则包可以是具体的规则文件形成的,也可以是规则流(ruleflow)文件形成的,在添加规则文件时,需要通过使用ResourceType的枚举值来指定规则文件的类型;同时在指定规则文件的时候drools还提供了一个名为ResourceFactory的对象,通过该对象可以实现从Classpath、URL、File、ByteArray、Reader或诸如XLS的二进制文件里添加载规则。在规则文件添加完成后,可以通过使用hasErrors()方法来检测已添加进去的规则当中有没有错误,如果不通过该方法检测错误,那么如果规则当中存在错误,最终在使用的时候也会将错误抛出。代码清单1-2就演示了通过KnowledgeBuilder来检测规则当中有没有错误。代码清单1-2packagetest;importjava.util.Collection;importjava.util.Iterator;importorg.drools.builder.KnowledgeBuilder;importorg.drools.builder.KnowledgeBuilderErrors;importorg.drools.builder.KnowledgeBuilderFactory;importorg.drools.builder.ResourceType;importorg.drools.definition.KnowledgePackage;importorg.drools.io.ResourceFactory;publicclassTest{publicstaticvoidmain(String[]args){KnowledgeBuilderkbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();kbuilder.add(ResourceFactory.newClassPathResource(test.drl,Test.class),ResourceType.DRL);if(kbuilder.hasErrors()){System.out.println(规则中存在错误,错误消息如下:);KnowledgeBuilderErrorskbuidlerErrors=kbuilder.getErrors();for(Iteratoriter=kbuidlerErrors.iterator();iter.hasNext();){System.out.println(iter.next());}}CollectionKnowledgePackagekpackage=kbuilder.getKnowledgePackages();//产生规则包的集合}页}后面随着介绍的深入我们还会看到KnowledgeBuilder的一些其它用法。1.3.2.KnowledgeBaseKnowledgeBase是Drools提供的用来收集应用当中知识(knowledge)定义的知识库对象,在一个KnowledgeBase当中可以包含普通的规则(rule)、规则流(ruleflow)、函数定义(function)、用户自定义对象(typemodel)等。KnowledgeBase本身不包含任何业务数据对象(fact对象,后面有相应章节着重介绍fact对象),业务对象都是插入到由KnowledgeBase产生的两种类型的session对象当中(StatefulKnowledgeSession和StatelessKnowledgeSession,后面会有对应的章节对这两种类型的对象进行介绍),通过session对象可以触发规则执行或开始一个规则流执行。创建一个KnowledgeBase要通过KnowledgeBaseFactory对象提供的newKnowledgeBase()方法来实现,这其中创建的时候还可以为其指定一个KnowledgeBaseConfiguration对象,KnowledgeBaseConfiguration对象是一个用来存放规则引擎运行时相关环境参数定义的配置对象,代码清单1-3演示了一个简单的KnowledgeBase对象的创建过程。代码清单1-3packagetest;importorg.drools.KnowledgeBase;importorg.drools.KnowledgeBaseFactory;publicclassTest{publicstaticvoidmain(String[]args){KnowledgeBasekbase=KnowledgeBaseFactory.newKnowledgeBase();}}