规则引擎DROOLS简明教程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2)设置传递到 url 脚本的参数实例:
WorkingMemory workingMemory = businessRules.newWorkingMemory();
workingMemory.assertObject(xxx);
3)执行规则:
workingMemory.fireAllRules(filter); //filter 规则为过虑器
规则引擎—— Drools 2 实例应用指南
本文给出了如何利用 Drools 来执行业务规则实例。 在将这个例子之前,我先简单的介绍规则引擎的工作步骤。 1)加载 rul 规则描述脚本:
RuleBase businessRules = RuleBaseLoader.loadFromUrl(url);
package com.primeton.juxtapose.rule.example;
/** * 简单的 JavaBean 保存 student 值。用于存放与学生相关的信息。 * 包括 姓名、年龄、性别、是否推荐入学等。 * * 根据学生的性别、年龄等判断该学生是否可以入读某一学校。 * 如: 某女子学校可能只接受性别为女的学生; * 某学校可能只接受年龄大于 15 岁的学生入学; * 某女子学校可能只接受性别为女且年龄大于 18 岁的学生入学; * ...... * * @author liuxiang * */ public class Student { //常量 public final static String YES="YES"; public final static String NO="NO";
在以前的文章中,“用 Drools 让你的商业逻辑使用框架”,我介绍了 Drools 框架,展示了它如何用 来组织复杂的商业逻辑。Drool 用一组简单的,众所周知的事物替换了许多缠杂的 if…then 表达 式。如果你经历过和商业客户的会议,并为他们提出的想要实现的东西的复杂程度搞得头痛,或 许你应该考虑一下像 Drools 这样的规则引擎了。这篇文章将向你展示如何在企业级 Java 应用中 使用 Drools.
this.schoole = schoole; } /** * 获得孩子希望就读的学校 * @return */ public String getSchoole(){ return this.schoole; } }
2。对于业务逻辑考虑用一个简单得 Java 类来实现,用来模拟执行商业逻辑。类 BusinessLogicLayer,用于模拟商业逻辑的执行。
Drools Drools 被设计为可插入式的语言实现。目前规则能用 Java, Python 和 Groovy 实现。更为重要 的是,Drools 提供了声明式程序设计(Declarative Programming),并且使用域描述语言 (Domain Specific Languages (DSL))-专为你的问题域定义了某种模式的 Xml, 它已经足够 灵活到可以用来描述你的问题域。DSLs 包含的 XML 元素(Element)和属性(Attribute)代表了问 题域中各种要素。
这段时间企业级 Java 简直能让你睡着。有多少 J2EE-EJB 应用程序只是从网页提取数据并把它们 存 入 到 数 据 库 中 ?但 开 发 者 真 正 应 该 开 发 和 维 护 的 却 是 他 们 应 用 程 序 中 复 杂 的 商 业 逻 辑 。这 个 问 题 不仅仅适用于将要新应用,而且渐渐地,也适用于那些长期运行的商业核心应用,它们的内部逻 辑也需要经常改变,而且往往要求在一个非常短的时间内。
一路到底的框架
大多数开发者都有自己喜爱的框架。无特定顺序,它们包括表现层框架(Struts, JSF, Cocoon 和 Spring),持久化框架(JDO, Hibernate, Cayenne and Entity Beans)以及结构框架(EJB, 又是 Spring, Pico 和 Excalibur), 还有其它很多。每种框架都各有所长,给开发者提供子许多“即 开即用”的功能。使用框架来部署应用意味着你避免了许多让人厌烦的细节,让你集中注意力到关 键之处。 到目前为直,在框架所能做的事中仍然有一个缺口,那就是商业逻辑没有框架。像 EJB 和 Spring 这样的工具虽好,但它们却几乎没有提及怎么组织你的那些 if …then 语句。把 Drools 加到你的 开发工具箱中意味着现在你可以“一路到底”的使用框架来构建你的应用程序。图 1 显示了这样的 一个应用
答 案 是 :“ 令 人 吃 惊 的 好 ”。大 多 数 开 发 者 只 是 因 为 不 愿 “失 控 ” 而 依 赖 于 他 人 的 代 码( 比 如 :某 种 框 架),想想这个:Drools 不仅可以让你的应用和“传统”的编程方法一样快,甚至可以更快,看下面:
● 避免糟糕的代码:Drools 引导开发者去做“正确的事”。你可以确定你正在写的代码是好的,但 你的开发伙伴呢?你可以同样这样说吗?使用框架可以让你更轻松地写出更快,更好的代码。
● 我的应用程序有多复杂?对于那些只是把数据从数据库中传入传出,并不做更多事情的应用程 序,最好不要使用规则引擎。但是,当在 Java 中有一定量的商业逻辑处理的话,可以考虑 Drools 的使用。这是因为很多应用随着时间的推移越来越复杂,而 Drools 可以让你轻松应对这一切。
● 我的应用的生命周期有多久?这个问题的正确答案往往是“令人惊讶的长”――还记得那些认为 他们的程序不会苟活到 2000 年的大型机的程序员吗?使用规则引擎将会在中长期得到好处。像 这篇文章所展示的那样,甚至原型都能从 Drools 与灵活方法的组合中获益,让“原型系统”转化成 生产系统。
/** * 设置学生姓名 * @param studentName */ public void setStudentName(String studentName){ this.studentName = studentName; } /** * 获得学生姓名 * @return */ public String getStudentName(){ return this.studentName; } /** * 设置学生年龄 * @param studentAge
● 优化过的框架:你有多少次看见商业逻辑重复地从数据库中提取相同的信息,从而降低了整个 应用的速度?如果正确使用的话,Drools 不仅仅能够记住信息,而且还能记住以往使用该信息进 行测试的结果,从而大幅提升应用的速度。
● Rete 算法:很多次我们并不是真正需要使用“if ”条件。被 Drools 实现的 Rete 算法,可以用一 个优化的方法替换掉所有的“if…then”表达式。需要重点提及的是:Rete 算法在使用更多的内存 来降低运行时延迟方面作了折衷。当然这在现代的应用服务器中并不是一个问题,我们也并不推 荐你在移动手机上使用 Drools!
//内部变量 private String studentName =null; private int studentAge = 0; private String studentSex = null; private String recommend = null; private String schoole = null;
rul 的语法比较简单,从以下例子中就能体会出来,这里不讲述了。
考虑这样一种情况,某学校 USST 希望招收的学校其年龄应该大于 15 岁,另外一个学校 FUDAN 希望其招收的学生大于 18 岁.当然,不同的学校对学生的要求可能不一样,例如年龄、性别、成绩 等。如果采用大量的 if...else 语句写在业务逻辑层,将来随着学校招生的要求变化,需要应用程 序开发人员,不断的修改业务规则。现在考虑采用 Drools 来使商务逻辑从应用程序中分离出来。 1。首先设计一个 Student 类,包括姓名、年龄、性别、希望就读学校。类文件如下:
/** * 一个简单的业务逻辑层,用来模拟商业逻辑。 * * @author liuxiang * */ public class BusinessLogicLayer { private static final String BUSINESS_RULE_FILE="BusinessRulesStudent.drl"; private static RuleBase businessRules = null;
package com.primeton.juxtapose.rule.example;
import java.io.IOException; import org.drools.DroolsException; import org.drools.IntegrationException; import org.drools.RuleBase; import org.drools.WorkingMemory; import org.drools.event.DebugWorkingMemoryEventListener; import org.drools.io.RuleBaseLoader; import org.drools.spi.Activation; import org.drools.spi.AgendaFilter; import org.xml.sax.SAXException;
*/ public void setStudentAge(int studentAge){ this.studentAge = studentAge; } /** * 获得学生年龄 * @return */ public int getStudentAge(){ return this.studentAge; } /** * 设置学生性别 * @param studentSex */ public void setStudentSex(String studentSex){ this.studentSex = studentSex; } /** * 获得学生性别 * @return */ public String getStudentSex(){ return this.studentSex; } /** * 设置是否推荐入学 * @param recommend */ public void setRecommend(String recommend){ this.recommend = recommend; } /** * 获得是否推荐入学 * @return */ public String getRecommend(){ return this.recommend; } /** * 设置孩子希望就读的学校 * @param schoole */ public void setSchoole(String schoole){
● 我的应用需要改变吗?唯一能确定的是你的需求将会改变,无论是在开发过程中或是在开发完 成以后。Drools 使用一个或多个简单易配的 XML 文件帮你来应对这一切。
那么性能呢?
如果你正在写一个企业级应用,很有可能它会扩展到成百(如果不是成千)的用户。你已经知道 现有的 Java 和 J2EE 应用能做到这一点,但一个使用了 Drools 的应用对这一压力的表现如何?
什么是 Drools
规则引擎 Drools 简明教程
Drools 是一个基于 Charles Forgy's 的 Rete 算法的,专为 Java 语言所设计的规则引擎。Rete 算法应用于面向对象的接口将使基于商业对象的商业规则的表达更为自然。Drools 是用 Java 写 的,但能同时运行在 Java 和.Net 上。
图 1. 用于 Java 应用的框架
这篇文章将基于我们已经了解的 Drools 框架的功能,这些功能可以让我们构建这样的一个果你有一把锤子,那所有的东西都看起来都像钉子”,这句话在软件工程领域几乎成了陈词滥 调了。虽然规则引擎能解决我们的许多问题,但确实值得认真考虑一下规则引擎对我们的企业级 Java 应用是否合适。需要问的问题有:
相关文档
最新文档