规则
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
规则集( 规则集(Rule Set) )
顾名思义,规则集就是许多规则的集合。每条规则包 含一个条件过滤器和多个动作。一个条件过滤器可以包含 多个过滤条件。条件过滤器是多个布尔表达式的组合,其 组合结果仍然是一个布尔类型的。在程序运行时,动作将 会在条件过滤器值为真的情况下执行。除了一般的执行动 作,还有三类比较特别的动作,它们分别是:放弃动作 (Discard Action)、包含动作(Include Action)和使信 息元对象内容持久化的动作。
组成规则引擎的构件
事实1 事实2 事实N 规则集
• • • • •
1、信息元 2、信息服务 3、规则集 4、队列管理器 5、规则执行引擎
信息服务 信息服务1 信息服务2 信息服务N
规则1 规则2 规则N
信息元 信息元1 信息元2 信息元N
队列管理器 信息元2 信息元1 信息元N
规则执行引擎
信息元( 信息元(Information Unit) )
信息元是规则引擎的基本建筑块,它是规则引擎处理 的对象,它是一个包含了特定事件的所有信息的对象。这 些信息包括:信息元类型、相关规则集、对象固有方法、 对象固有属性以及一些系统相关信息等等。
信息服务( 信息服务(Information Services) )
信息服务产生信息元对象。每个信息服务产生它自己 类型相对应的信息元对象。即特定信息服务根据信息元所 产生每个信息元对象有相同的格式,但可以有不同的属性 和规则集。需要注意的是,在一台机器上可以运行许多不 同的信息服务,还可以运行同一信息服务的不同实例。但 无论如何,每个信息服务只产生它自己类型相对应的信息 元。
当客户要求增加考生报考年龄上限限制(例如上限为30岁) 时,只需要修改规则文件即可,修改后的规则文件如下
package com.dw.exam.enroll.rule; import com.dw.exam.enroll.dao.Student; //年龄大于20的考生才可以报考 rule "nlxx" when $sup : Student(nl<=20) then $sup.setErrorMsg("【年龄大于20的考生才可以报考!】") ; end //年龄小于30的考生才可以报考 rule "nlsx" when $sup : Student(nl>30) then $sup.setErrorMsg("【年龄必须小于30岁才可以报考!】") ; end
创建考生年龄验证的规则文件( 创建考生年龄验证的规则文件(Student_NL.drl) )
package com.dw.exam.enroll.rule; import com.dw.exam.enroll.dao.Student; //年龄大于20的考生才可以报考 rule "zjcsrq" when $sup : Student(nl<=20); then $sup.setErrorMsg("【年龄大于20的考生才可以报考!】") ; end
规则是如何解决问题的
规则执行的时候,信息服务以事实和集中存储的规则集为 入参生成特定的信息元,然后再由规则执行引擎按照一定的匹配 及调度算法来执行信息元描述的动作。 规则引擎的这种执行方式决定了它对外的接口(规则执行的 API)比较简单和固定,而且对规则集的修改不会影响规则调用 的接口。这就成功地将商业决策者的商业决策逻辑和应用开发者 的技术决策进行了分离,降低了应用程序中复杂业务逻辑实现组 件的复杂性,从而降低了应用程序的维护成本。
OpenRules
OpenRules基于java完全开放源代码的商业规则管理框架。 它有效的利用了MS Excel, Eclipse IDE 和其它java开源类库去 构造,维护,部署,执行不同的复杂商业逻辑的规则引擎。
另外,支持规则的开源产品还有:Mandarax、 JLisa、JEOPS(演绎法规则)、InfoSapient、 JRuleEngine Roolie JRuleEngine、Roolie等。 商业产品包括Jess等。
什么是规则引擎
规则引擎是规则执行的环境,它重点解决如何描述、 执行、监控规则。
规则引擎产生的背景
随着信息技术在企业的广泛的应用,企业 IT 部门所 开发和维护的应用系统也越来越复杂,而现代企业要求响 应快速及灵活,他们对企业软件也有同样的要求。企业管 理者对企业级IT系统的开发有着如下的要求: 一、为提高效率,管理流程必须自动化,即使现代商业 规则异常复杂。 二、市场要求业务规则经常变化,IT系统必须依据业务 规则的变化快速、低成本的更新。 三、为了快速、低成本的更新,业务人员应能直接管理 IT系统中的规则,不需要程序开发人员参与。
• 创建规则集
在创建规则集之前,首先简要介绍一下Drools规则集以 及Drools规则的语法。 一个Drools规则集至少要包含下面的元素。 1、规则集所在包的定义。 2、规则集涉及到的事实类的引用 3、一个或多个规则
• 一个规则内必须包含下面的元素
rule "nlxx" when //规则执行的条件 then //满足条件时规则执行的动作 end //规则的名字
主程序中对考生年龄的验证方法
void checkStudent(Student student)throws AppException{ ArrayList<Object> input = new ArrayList<Object>(); input.add(student); //RuleUtil.invokeRule为我们封装的调用规则的API RuleUtil.invokeRule("com.dw.exam.enroll.rule.Student_NL.drl",input); if(!"".equals(student.getErrorMsg())){ throw new AppException(student.getErrorMsg()); } }
支持规则的产品
现在规则的理论以及技术发展得已经比较成熟了, 支持规则的产品也有很多,比较有代表性的有下面几个:
JBoss Drools
Drools是Jboss公司旗下一款开源的规则引擎,它完整的实现了Rete算法(一种模 式匹配算法,也是规则引擎中最普遍,效率最高的一种算法);提供了强大的 EclipsePlugin开发支持;通过使用其中的DSL(DomainSpecificLanguage),可以实现 用自然语言方式来描述业务规则,使得业务分析人员也可以看懂业务规则代码。
规则可以解决的问题
使用规则引擎可以通过降低实现复杂业务逻辑的组件 的复杂性,降低应用程序的维护和可扩展性成本,具体表 现如下: 1、分离了商业决策者的商业决策逻辑和应用开发者的 技术决策; 2、有效的提高实现复杂逻辑的代码的可维护性; 3、应付特殊状况,即增加或修改客户一开始没有提到 的业务需求; 4、非常适合在敏捷或迭代开发过程中使用;
队列管理器( 队列管理器(Queue Manager) )
队列管理器用来管理来自不同信息服务的信息元对 象的队列。它具体负责信息元对象的入队、出队、调度执 行等。
• 规则执行引擎(Rule Execution Engine)
规则引擎从队列管理器中依次接收信息元(若是 java规则引擎,即为java对象),然后依规则定义的顺序 检查第一个规则并对其条件过滤器求值,如果值为假,所 有与此规则相关的动作皆被忽略并继续执行下一条规则。 如果第二条规则的过滤器值为真,所有与此规则相关的动 作皆依定义顺序执行,执行完毕继续下一条规则。该信息 元中的所有规则执行完毕后,信息元将被销毁,然后从队 列管理器接收下一个信息元。
规则
• • • • • • •
什么是规则以及规则引擎 规则引擎产生的背景 规则可以解决的问题 组成规则引擎的构件 规则是如何解决问题的 支持规则的产品 一个Drools规则的例子
什么是规则以及规则引擎
什么是规则
规则是描述业务逻辑的一种方法,它由条件和动作两 部分组成(满足某些条件时执行某些动作)。所有的规则 必须由某种指定的语言来定义并且存储于规则集中。 在业务需求中,一般把约束、完整性、校验、分支流 等列入规则的范畴。
一个Drools规则的例子 规则的例子 一个
• 下面以对考生信息验证的需求为例,看一下规则是如何解 决实际问题的 需求描述: 考生的基本信息中包括考号、姓名、年龄等信息,在 对考生信息进行持久化的时候,需要验证年龄是否大于20 岁,大于20岁的考生才允许报考,所以才持久化之前需要 对考生的年龄进行判断。
另外,项目开发人员会碰到了以下问题: 一、程序=算法+数据结构,有些复杂的商业规则很难推导出算法和 抽象出数据模型。 二、软件工程要求从需求—>设计—>编码,然而业务规则常常在需 求阶段可能还没有明确,在设计和编码后还在变化,业务规则往 往嵌在系统各处代码中。 三、对程序员来说,系统已经维护、更新困难,更不可能让业务人员 来管理。 但是,当包含业务逻辑的代码隐藏在大量其他代码中时,修改就变得缓 慢、痛苦且易出错了。因此,复杂企业级项目的开发以及其中随外部条件不 断变化的业务规则,迫切需要分离商业决策者的商业决策逻辑和应用开发者的 技术决策,并把这些商业决策放在中心数据库或其他统一的地方,让它们能 在运行时(即商务时间)可以动态地管理和修改从而提供软件系统的柔性和 适应性。规则引擎正是应用于上述动态环境中的一种解决方法。
修改完成后,用新的规则文件替换旧的 规则文件,新的验证规则即可生效。
谢谢
来自百度文库
创建考生类(事实)
Class Student{ private String ksid=""; private String ksxm=""; private int nl = ""; private String errorMsg = ""; public getter() ^^^^^^ public setter() }