文档库 最新最全的文档下载
当前位置:文档库 › JAVA规则引擎 -- Drools

JAVA规则引擎 -- Drools

JAVA规则引擎 -- Drools
JAVA规则引擎 -- Drools

Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。

1、Drools语法

开始语法之前首先要了解一下drools的基本工作过程,通常而言我们使用一个接口来做事情,首先要穿进去参数,其次要获取到接口的实现执行完毕后的结果,而drools也是一样的,我们需要传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后得到的结果。在drools 中,这个传递数据进去的对象,术语叫Fact对象。Fact 对象是一个普通的java bean,规则中可以对当前的对象进行任何的读写操作,调用该对象提供的方法,当一个java bean插入到workingMemory中,规则使用的是原有对象的引用,规则通过对fact对象的读写,实现对应用数据的读写,对于其中的属性,需要提供getter setter访问器,规则中,可以动态的往当前workingMemory中插入删除新的fact对象。

规则文件可以使用 .drl文件,也可以是xml文件,这里我们使用drl文件。规则语法:

package:对一个规则文件而言,package是必须定义的,必须放在规则文件第一行。特别的是,package的名字是随意的,不必必须对应物理路径,跟java 的package的概念不同,这里只是逻辑上的一种区分。同样的package下定义的function和query等可以直接使用。

比如:package com.drools.demo.point

import:导入规则文件需要使用到的外部变量,这里的使用方法跟java相同,但是不同于java的是,这里的import导入的不仅仅可以是一个类,也可以是这个类中的某一个可访问的静态方法。

比如:

import com.drools.demo.point.PointDomain;

import com.drools.demo.point.PointDomain.getById;

rule:定义一个规则。rule "ruleName"。一个规则可以包含三个部分:

属性部分:定义当前规则执行的一些属性等,比如是否可被重复执行、过期时间、生效时间等。

条件部分,即LHS,定义当前规则的条件,如 when Message(); 判断当前workingMemory中是否存在Message对象。

结果部分,即RHS,这里可以写普通java代码,即当前规则条件满足后执行的操作,可以直接调用Fact对象的方法来操作应用。

规则事例:

rule "name"

no-loop true

when

$message:Message(status == 0)

then

System.out.println("fit");

$message.setStatus(1);

update($message);

end

上述的属性中:

no-loop: 定义当前的规则是否不允许多次循环执行,默认是false,也就是当前的规则只要满足条件,可以无限次执行。什么情况下会出现一条规则执行过一次又被多次重复执行呢?drools提供了一些api,可以对当前传入workingMemory中的Fact对象进行修改或者个数的增减,比如上述的update 方法,就是将当前的workingMemory中的Message类型的Fact对象进行属性更新,这种操作会触发规则的重新匹配执行,可以理解为 Fact对象更新了,所以规则需要重新匹配一遍,那么疑问是之前规则执行过并且修改过的那些Fact对象的属性的数据会不会被重置?结果是不会,已经修改过了就不会被重置,update 之后,之前的修改都会生效。当然对Fact对象数据的修改并不是一定需要调用update才可以生效,简单的使用set方法设置就可以完成,这里类似于java 的引用调用,所以何时使用update是一个需要仔细考虑的问题,一旦不慎,极有可能会造成规则的死循环。上述的 no-loop true,即设置当前的规则,只执行一次,如果本身的RHS部分有update等触发规则重新执行的操作,也不要再次执行当前规则。

但是其他的规则会被重新执行,岂不是也会有可能造成多次重复执行,数据紊乱甚至死循环?答案是使用其他的标签限制,也是可以控制的:lock-on-active true

lock-on-active true:通过这个标签,可以控制当前的规则只会被执行一次,因为一个规则的重复执行不一定是本身触发的,也可能是其他规则触发的,所以这个是no-loop的加强版。当然该标签正规的用法会有其他的标签的配合,后续提及。

date-expires:设置规则的过期时间,默认的时间格式:“日-月-年”,中英文格式相同,但是写法要用各自对应的语言,比如中文:"29-七月-2010",但是还是推荐使用更为精确和习惯的格式,这需要手动在java代码中设置当前系统的时间格式,后续提及。属性用法举例:date-expires "2011-01-31 23:59:59" // 这里我们使用了更为习惯的时间格式

date-effective:设置规则的生效时间,时间格式同上。

duration:规则定时,duration 3000 3秒后执行规则

salience:优先级,数值越大越先执行,这个可以控制规则的执行顺序。

其他的属性可以参照相关的api文档查看具体用法,此处略。

规则的条件部分,即LHS部分:

when:规则条件开始。条件可以单个,也可以多个,多个条件一次排列,比如

when

eval(true)

$customer:Customer()

$message:Message(status==0)

上述罗列了三个条件,当前规则只有在这三个条件都匹配的时候才会执行RHS

部分,三个条件中第一个

eval(true):是一个默认的api,true 无条件执行,类似于 while(true)

$message:Message(status==0)这句话标示的:当前的workingMemory存在Message类型并且status属性的值为0的Fact对象,这个对象通常是通过外部java代码插入或者自己在前面已经执行的规则的RHS部分中insert进去的。

前面的$message代表着当前条件的引用变量,在后续的条件部分和RHS部分中,可以使用当前的变量去引用符合条件的FACT对象,修改属性或者调用方法等。可选,如果不需要使用,则可以不写。

条件可以有组合,比如:

Message(status==0 || (status > 1 && status <=100))

RHS中对Fact对象private属性的操作必须使用getter和setter方法,而RHS 中则必须要直接用.的方法去使用,比如

$order:Order(name=="qu")

$message:Message(status==0 && orders contains $order &&

$https://www.wendangku.net/doc/824949407.html,=="qu")

特别的是,如果条件全部是 &&关系,可以使用“,”来替代,但是两者不能混用

如果现在Fact对象中有一个List,需要判断条件,如何判断呢?

看一个例子:

Message {

int status;

List names;

}

$message:Message(status==0 && names contains "网易" && names.size >= 1)

上述的条件中,status必须是0,并且names列表中含有“网易”并且列表长度大于等于1

contains:对比是否包含操作,操作的被包含目标可以是一个复杂对象也可以是一个简单的值。

Drools提供了十二中类型比较操作符:

> >= < <= == != contains / not contains / memberOf / not memberOf /matches/ not matches

not contains:与contains相反。

memberOf:判断某个Fact属性值是否在某个集合中,与contains不同的是他被比较的对象是一个集合,而contains被比较的对象是单个值或者对象。

not memberOf:正好相反。

matches:正则表达式匹配,与java不同的是,不用考虑'/'的转义问题

not matches:正好相反。

规则的结果部分

当规则条件满足,则进入规则结果部分执行,结果部分可以是纯java代码,比如:

then

System.out.println("OK"); //会在控制台打印出ok

end

当然也可以调用Fact的方法,比如 $message.execute();操作数据库等等一切操作。

结果部分也有drools提供的方法:

insert:往当前workingMemory中插入一个新的Fact对象,会触发规则的再次执行,除非使用no-loop限定;

update:更新

modify:修改,与update语法不同,结果都是更新操作

retract:删除

RHS部分除了调用Drools提供的api和Fact对象的方法,也可以调用规则文件中定义的方法,方法的定义使用 function 关键字

function void console {

System.out.println();

StringUtils.getId();// 调用外部静态方法,StringUtils必须使用import 导入,getId()必须是静态方法

}

Drools还有一个可以定义类的关键字:

declare可以再规则文件中定义一个class,使用起来跟普通java对象相似,你可以在RHS部分中new一个并且使用getter和setter方法去操作其属性。

declare Address

@author(quzishen) // 元数据,仅用于描述信息

@createTime(2011-1-24)

city : String @maxLengh(100)

postno : int

end

上述的'@'是什么呢?是元数据定义,用于描述数据的数据~,没什么执行含义

你可以在RHS部分中使用Address address = new Address()的方法来定义一个对象。

Drools 规则引擎

Drools规则引擎 1. 概述: Drools分为两个主要部分:构建(Authoring)和运行时(Runtime)。 构建的过程涉及到.drl或.xml规则文件的创建,它们被读入一个解析器,使用ANTLR 3 语法进行解析。解析器对语法进行正确性的检查,然后产生一种中间结构“descr”,descr 用AST来描述规则。AST然后被传到PackageBuilder,由PackagBuilder来产生Packaged对象。PackageBuilder还承担着一些代码产生和编译的工作,这些对于产生Package对象都时必需的。Package对象是一个可以配置的,可序列化的,由一个或多个规则组成的对象。下图阐明了上述过程: Figure 1.1 Authoring Components RuleBase 是一个运行时组件,它包含了一个或多个 Package 对象。可以在任何时刻将一个 Package 对象加入或移出 RuleBase 对象。一个 RuleBase 对象可以在任意时刻实例化一个或多个 WorkingMemory 对象,在它的内部保持对这些WorkingMemory 的弱引用。 WorkingMemory 由一系列子组件组成。当应用程序中的对象被 assert 进 WorkingMemory ,可能会导致一个或多个 Activation 的产生,然后由 Agenda 负责安排这些 Activation 的执行。下图说明了上述过程:

Figure 1.2 . Runtime Components 2.构建(Authoring): 主要有三个类用来完成构建过程:DrlParser, XmlParser 和 PackageBuilder。两个解析器类从传入的Reader实例产生descr AST模型。PackageBuilder提供了简便的API,使你可以忽略那两个类的存在。这两个简单的方法是:“addPackageFromDrl”和“addPackageFromXml”,两个都只要传入一个Reader 实例作为参数。下面的例子说明了如何从classpath中的xml和drl文件创建一个Package对象。注意:所有传入同一个PackageBuilder实例的规则源,都必须是在相同的package 命名空间(namespace)中。 PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( " package1.drl" ) ) ); builder.addPackageFromXml( new InputStreamReader( getClass().getResourceAsStream( " package2.drl" ) ) ); Package pkg = builder.getPackage();

Drools规则引擎开发说明

Drools规则动态更新 在常规开发方式中,如果涉及规则的变更(比如将物流费用从6元调整为8元),可以通过重新完成规则的开发并发布应用来更新。或在设计上,将可能变更的规则以配置(比如数据库)方式管理。发生规则变更时,只需修改配置即可。事实上,Drools提供了另一种规则更新的方式--扫描Maven仓库(本地或远程)来自动发现规则模块的更新。 我们知道,Drools可以利用KieServices来创建基于classpath的KieContainer(即使用KieServices.newKieClasspathContainer()方法)。其实,KieServices还提供了从Maven 仓库加载并创建KieContainer的方法--newKieContainer(ReleaseId)。与通过classpath 创建KieContainer类似,使用Maven仓库加载的方法,会尝试读取对应jar包中的META-INF/kmodule.xml文件,基于此,我们可以完成KieSession的创建。 我们通过一个简单的例子来观察规则的动态更新。在这个例子中,我们会将商品的折扣进行动态调整。我们需要构建规则,并安装到Maven仓库中--简单起见,我们将应用发布到本地Maven仓库中。首先,我们创建一个Maven项目: $mvn-B archetype:generate-DarchetypeGroupId=org.apache.maven.archetypes\ -DgroupId=com.sharp.rules-DartifactId=discount 如果没什么问题,我们可以得到一个名为discount的文件夹,其中的pom.xml看起来像这样: 4.0.0 com.sharp.rules discount jar 1.0-SNAPSHOT discount https://www.wendangku.net/doc/824949407.html, junit junit 3.8.1 test 在src/main/java/com/sharp/rules下创建Fact类: package com.sharp.rules; public class Commodity{ private double discount;

Drools规则引擎的使用总结

前一段时间在开发了一个做文本分析的项目。 在项目技术选型的过程中, 尝试使用了 Drools 规则引擎。让它来作为项目中有关模式分析和关键词匹配的任务。但后来,因为某种原因, 还是撇开 了 Drools 。现将这个过程中使用 Drools 的一些经验和心得记录下来。 (一)什么时候应该使用规则引擎 ~这实际是一个技术选型的问题。 但这个问题又似乎是一个很关键的问题 (一旦返工的话, 你就知道这个问题是多么重要了)。不知大家有没有过这样的经验和体会。 往往在项目开始 的时候,总会遇到应该选用什么技术?是不是应该使用最新的技术?或者应该选用什么技术 呢(PS : 现在计算机软件中的各种技术层出不穷,具有类似功能的技术很多 )? 不管怎么样,这些问题总会困扰着我。比如,这次的这个项目。项目要求是要在一些 文件中(这些log 文件都是很大的应用系统所产生的,但由于legacy 的原因,log 本身的维 护 和规范工作一直没有得到改善,所以想借助于一些外部应用对这些 log 做以分析和清洗) 抽取出有用的信息。 于是,第一个想到的就是,这是一个文本挖掘类的项目。但又想,要抽取有用信息,必 须得建立一些规则或 pattern (模式)。所以,我第一个想到了规则引擎。因为这里面要建 立好多规则,而这些规则可以独立于代码级别( 引擎去解析和执行。另一个重要的原因是,我原来用 过,比较熟悉。这样,也可以节省开发 时间吧。于是,好不犹豫的就开始做了 Demo.... 但事实上,在经历了一个多星期的编码、 测试后,我发现运用规则引擎实在是太笨拙了。 (1)首先必须建立一些数据模型。通过这些模型来 refer 规则文件中的LHS 和Action 。 (2 )还要考虑规则的 conflict 。如果有一些规则同时被触发,就要考虑设定规则的优先 级或者 是设定activiation-group 来保证在一个group 中的规则只有一个规则可以被触发。 (3)对于 流'规则group ruleflow-group 的使用。如果要控制在 workingmemory 中的规 则被触发的顺序,则可以将这些规则分组。然后, 通过规则建模的方式来实现。但这也添加 了一定的effort 。修改或者更新不大方便。 ~所以,基于上述体会,我更认为规则引擎更适用于那些对非流程性规则匹配的应用。当 然,Drools 也支持对流程性规则的建模过程。但,这也许不是最好的方式。 (二) Drools 规则引擎的使用杂记 (1) Fact 的变更监听。在Drools 里,如果一个Fact 通过规则而改变,则需将这种 改变通知 给规则引擎。这里,一般有两种方式:显式和隐式。 显式---在drl 文件中通过 up date 、modify 来通知;在程序中,通过 Fact 的引用调用 modifyObject 等方法来实现。 隐式---通过在Java bea n 实现property Liste ner In terface 来让引擎自动监听到属性 值的变化。我更习惯于这种方式。因为,一般看来凡是在规则引擎中添加到 fact 都是希望 引擎来帮你进行管理的。所以,那它自己看到 fact 的变化是种很省事的办法。也很简单, 就是用Java bean property 监听的方式。 通过 StatefulSession 来注册。 调用 StatefulSession 的某个 instanee 的 insert ( Object ,true )实现。而这个 object 是一个java bean 。其中,要实现 P rivate final Prop ertyCha ngeS upport cha nges Prop ertyCha ngeS upp ort( this ); public void add PropertyChangeListener(final PropertyChangeListener l) { this.cha nges.add Prop ertyCha ngeListe ner( l ); log 放到一个单独的drl 文件里)并可以用规则 =new

JAVA规则引擎 -- Drools

Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。 1、Drools语法 开始语法之前首先要了解一下drools的基本工作过程,通常而言我们使用一个接口来做事情,首先要穿进去参数,其次要获取到接口的实现执行完毕后的结果,而drools也是一样的,我们需要传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后得到的结果。在drools 中,这个传递数据进去的对象,术语叫Fact对象。Fact 对象是一个普通的java bean,规则中可以对当前的对象进行任何的读写操作,调用该对象提供的方法,当一个java bean插入到workingMemory中,规则使用的是原有对象的引用,规则通过对fact对象的读写,实现对应用数据的读写,对于其中的属性,需要提供getter setter访问器,规则中,可以动态的往当前workingMemory中插入删除新的fact对象。 规则文件可以使用 .drl文件,也可以是xml文件,这里我们使用drl文件。规则语法: package:对一个规则文件而言,package是必须定义的,必须放在规则文件第一行。特别的是,package的名字是随意的,不必必须对应物理路径,跟java 的package的概念不同,这里只是逻辑上的一种区分。同样的package下定义的function和query等可以直接使用。 比如:package com.drools.demo.point import:导入规则文件需要使用到的外部变量,这里的使用方法跟java相同,但是不同于java的是,这里的import导入的不仅仅可以是一个类,也可以是这个类中的某一个可访问的静态方法。 比如: import com.drools.demo.point.PointDomain; import com.drools.demo.point.PointDomain.getById; rule:定义一个规则。rule "ruleName"。一个规则可以包含三个部分: 属性部分:定义当前规则执行的一些属性等,比如是否可被重复执行、过期时间、生效时间等。 条件部分,即LHS,定义当前规则的条件,如 when Message(); 判断当前workingMemory中是否存在Message对象。 结果部分,即RHS,这里可以写普通java代码,即当前规则条件满足后执行的操作,可以直接调用Fact对象的方法来操作应用。

drools规则引擎的使用总结

前一段时间在开发了一个做文本分析的项目。在项目技术选型的过程中,尝试使用了Drools 规则引擎。让它来作为项目中有关模式分析和关键词匹配的任务。但后来,因为某种原因,还是撇开了Drools。现将这个过程中使用Drools的一些经验和心得记录下来。 (一)什么时候应该使用规则引擎 这实际是一个技术选型的问题。但这个问题又似乎是一个很关键的问题(一旦返工的话,你就知道这个问题是多么重要了)。不知大家有没有过这样的经验和体会。往往在项目开始的时候,总会遇到应该选用什么技术是不是应该使用最新的技术或者应该选用什么技术呢(PS:现在计算机软件中的各种技术层出不穷,具有类似功能的技术很多)? 不管怎么样,这些问题总会困扰着我。比如,这次的这个项目。项目要求是要在一些log文件中(这些log文件都是很大的应用系统所产生的,但由于legacy的原因,log 本身的维护和规范工作一直没有得到改善,所以想借助于一些外部应用对这些log做以分析和清洗)抽取出有用的信息。 于是,第一个想到的就是,这是一个文本挖掘类的项目。但又想,要抽取有用信息,必须得建立一些规则或pattern(模式)。所以,我第一个想到了规则引擎。因为这里面要建立好多规则,而这些规则可以独立于代码级别(放到一个单独的drl文件里)并可以用规则引擎去解析和执行。另一个重要的原因是,我原来用过,比较熟悉。这样,也可以节省开发时间吧。于是,好不犹豫的就开始做了Demo.... 但事实上,在经历了一个多星期的编码、测试后,我发现运用规则引擎实在是太笨拙了。 (1)首先必须建立一些数据模型。通过这些模型来refer规则文件中的LHS和Action。 (2)还要考虑规则的conflict。如果有一些规则同时被触发,就要考虑设定规则的优先级或者是设定activiation-group来保证在一个group中的规则只有一个规则可以被触发。 (3)对于‘流’规则group ruleflow-group的使用。如果要控制在workingmemory 中的规则被触发的顺序,则可以将这些规则分组。然后,通过规则建模的方式来实现。但这也添加了一定的effort。修改或者更新不大方便。

Drools5规则引擎介绍

Drools5规则引擎介绍 2011-7-27

目录 1 规则引擎介绍 (3) 1.1 什么是规则引擎 (3) 1.2 使用规则引擎的优势 (3) 1.3 什么场景适合使用规则引擎 (3) 2 Drools简介 (4) 2.1 Drools简介 (4) 2.2 Drools的使用场景 (4) 3 Drools的工作原理 (4) 3.1 规则的工作流程 (4) 3.2 Rete算法总结 (5) 4 Drools5的安装 (5) 4.1下载drools相关的组件 (5) 4.2 解压缩已下载文件并放入eclipse中 (5) 4.3 查看Drools是否安装成功 (6) 4.4配置drools的Runtime环境 (6) 5 创建第一个示例及代码分析 (7) 5.1 创建规则 (7) 5.2 代码分析(规则的编译和运行) (11) 5.2.1 KnowledgeBuilder (11) 5.2.2 KnowledgeBase (11) 5.2.3 StatefulKnowledgeSession (12) 5.2.4 StatelessKnowledgeSession (13) 5.2.5 Fact对象 (14) 6 规则 (14) 6.1 规则文件 (14) 6.2 规则语言 (15) 6.2.1 条件部分 (15) 6.2.2 结果部分 (16) 6.2.3 属性部分 (17) 6.2.4 函数 (17) 6.2.5 查询 (17) 6.2.6 对象定义 (18)

1 规则引擎介绍 1.1 什么是规则引擎 规则引擎是基于规则的专家系统的核心部分,主要由三部分组成:规则库(Knowledge base)+Working Memory(Fact base)+推理机(规则引擎),规则引擎根据既定事实和知识库按照一定的算法执行推理逻辑得到正确的结果。 规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。 目前,市面上应用产生了众多的规则引擎。开源规则引擎的代表是Drools;商业规则引擎的代表是ILog。 1.2 使用规则引擎的优势 能够将业务规则从技术实现中提取出来,实现技术和业务分离,开发人员处理技术、业务分析人员定义业务规则,各自做自己所擅长的事情。 1.3 什么场景适合使用规则引擎 虽然规则引擎能解决我们的许多问题,但我们还需要认真考虑一下规则引擎对我 们的项目本身是否是合适的。需要关注的点有: ? 我的应用程序有多复杂? 对于那些只是把数据从数据库中传入传出,并不做更多事情的应用程序,最好不要使用规则引擎。但是,当在Java中有一定量的商业逻辑处理的话,可以考虑Drools的使用。这是因为很多应用随着时间的推移越来越复杂,而Drools可以让你更轻松应对这一切。 ? 我的应用的生命周期有多久? 如果我们应用的生命周期很短,也没有必要使用Drools,使用规则引擎将会在中长期得到好处。

Drools开发教程、规则引擎

Drools5规则引擎规则引擎 开发开发教程教程教程 高杰 上海锐道信息技术有限公司 2009-8-20

1.学习前的准备 Drools是一款基于Java的开源规则引擎,所以在使用Drools之前需要在开发机器上安装好JDK环境,Drools5要求的JDK版本要在1.5或以上。 1.1. 开发环境搭建 大多数软件学习的第一步就是搭建这个软件的开发环境,Drools也不例外。本小节的内容就是介绍如何搭建一个Drools5的开发、运行、调试环境。 1.1.1.下载开发工具 Drools5提供了一个基于Eclipse3.4的一个IDE开发工具,所以在使用之前需要到https://www.wendangku.net/doc/824949407.html,网站下载一个 3.4.x版本的Eclipse,下载完成之后,再到https://www.wendangku.net/doc/824949407.html,/drools/downloads.html网站,下载Drools5的Eclipse插件版IDE及Drools5的开发工具包,如图1-1所示。

图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:\\eclipse\\drools-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。启动完成

规则引擎(DROOLS)培训资料v1.0.0

规则引擎(DROOLS)培训 DROOLS培训(5天) 目的: 重点讲解DROOLS是什么、能做什么、工作流程、怎么用到系统中,让学习人员可以对DROOLS有个全面初步的了解,并能够用DROOLS进行简单的系统开发。 参加人员: 需要使用DROOLS进行系统设计和开发或者对DROOLS感兴趣的同事。 主讲人员:

第一章 DROOLS 入门 第 1 节什么是DROOLS 如何组织企业应用中的业务逻辑,如果靠手工的代码来解决。随着大量业务规则的变化,导致应用程序不停的变更,如何能找到一种解决商业逻辑的架构,来解决当商务规则不停的变化时,可以保证我们的应用系统具有较好的柔韧性,可以适应特定的商务规则的变化,而无需修改我们的应用系统。Drools就是这样的一个应用在商务逻辑层的架构。 CODEHAUS的一个开源项目叫Drools,Drools是为Java量身定制的基于RETE算法的规则引擎的实现。 具有了OO接口的RETE,使得商业规则有了更自然的表达。Drools是用Java写的,但能同时运行在Java 和.Net上。最近被纳入JBOSS门下,更名为JBOSS Rules,成为了JBOSS应用服务器的规则引擎。 RETE算法是CHARLES FORGY在1979年发明的。RETE是唯一的,效率与执行规则数目无关的决策支持算法。For the uninitiated, that means it can scale to incorporate and execute hundreds of thousands of rules in a manner which is an order of magnitude more efficient then the next best algorithm。 RETE应用于生产系统已经有很多年了,但在Java开源软件中并没有得到广泛应用,直到DROOLS的出现。第 2 节 DROOLS能做什么 大多数web和企业Java应用可以分成三个部分:一个和用户交互的前台, 一个和后台系统,例如数据库交互的服务层,以及他们中间的业务逻辑。现在使用框架构建前台和后台系统已经成为普遍共识(例如, Struts, Cocoon, Spring, Hibernate, JDO, 和 Entity Beans), 但却没有一个标准的方法来构建业务逻辑。一些框架,例如 EJB 和 Spring 只在一个高层实现业务逻辑,但对于我们组织逻辑代码没有任何帮助,所以,为什么没有一个框架来替换冗繁,易错的if...then语句呢,这个框架应该和其它前台或后台框架一样,易于配置,具有可读性和重用性。Drools 规则引擎,这个就是来解决我们上述问题的框架。

相关文档