资源预览内容
第1页 / 共43页
第2页 / 共43页
第3页 / 共43页
第4页 / 共43页
第5页 / 共43页
第6页 / 共43页
第7页 / 共43页
第8页 / 共43页
第9页 / 共43页
第10页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
RuleEngine学习讨论陈华Java规则引擎与其规则引擎与其API (JSR-94)JSR-94规定了规则引擎的Java API,但没有规定用哪种语言描述规则。现在已经实现的规则描述语言有JESS、XML和Groovy等 规则引擎产生背景 (1)为提高效率,管理流程必须自动化 (2)市场要求业务规则经常变化,IT系统必须依据业务规则的变化快速、低成本的更新 (3)为了快速、低成本的更新,业务人员应能直接管理IT系统中的规则,不需要程序开发人员参与 碰到的问题()有些复杂的商业规则很难推导出算法和抽象出数据模型 ()规则在设计和编码后还在变化,业务规则往往嵌在系统各处代码中 ,很难维护基于规则的专家系统规则引擎由基于规则的专家系统中的推理引擎发展而来 专家系统专家系统是人工智能的一个分支 它模仿人类的推理方式,使用试探性的方法进行推理。并使用人类能理解的术语解释和证明它的推理结论 专家系统有很多分类 神经网络 基于案例推理和基于规则系统等。包括三部分Rule Base(knowledge base)Working Memory(fact base)Inference Engine(推理引擎) 基于规则的专家系统组成基于规则的专家系统组成 如上图所示 推理引擎包括三部分:Pattern Matcher、Agenda和Execution Engine。Pattern Matcher何时执行哪个规则何时执行哪个规则;Agenda管理PatternMatcher挑选出来的规则的执行次序执行次序;Execution Engine负责执行规则和其他动作。 原理推理引擎通过决定哪些规则满足事实或目标并授予规则优先级,满足事实或目标的规则被加入议程。 存在两者推理方式:演绎法(Forward-Chaining正向链)和归纳法(Backward-Chaining反向链)。演绎法从一个初始的事实出 发,不断地应用规则得出结论(或执行指定的动作)。而归纳法则是从假设出发,不断地寻找符合假设的事实。 规则引擎 业务规则 业务规则的理论基础是:设置一个或多个条件,当满足这些条件时会触发一个或多个操作。 规则引擎 (定义)规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据 输入,解释业务规则,并根据规则做出业务决策。 规则引擎的使用方式 规则引擎的程序接口至少包含以下几种 API加载和卸载规则集的API;数据操作的API;引擎执行的API 5个典型的步骤 1创建规则引擎对象 2向引擎中加载规则集或更换规则集 3向引擎提交需要被规则集处理的数据对象集合 4命令引擎执行 5导出引擎执行结果,从引擎中撤出处理过的数据 标准一个开放的业务规则引擎应该可以“嵌入”在应用程序的任何位置,不同位置的规则引擎可以使用不同的规则集,用于处理不同的数据对象。此外,对使用引擎的数 量没有限制。 业务规则引擎架构业务规则引擎架构 规则引擎的推理步骤如下 a. a. 将初始数据(将初始数据(factfact)输入至工作内存)输入至工作内存(Working (Working Memory) Memory) b. b. 使用使用Pattern MatcherPattern Matcher将规则库将规则库(Rules (Rules repository)repository)中的规则(中的规则(rulerule)和数据()和数据(factfact)比较)比较 c. c. 如果执行规则存在冲突(如果执行规则存在冲突(conflictconflict),即同时激),即同时激活了多个规则,将冲突的规则放入冲突集合。活了多个规则,将冲突的规则放入冲突集合。 d. d. 解决冲突,将激活的规则按顺序放入解决冲突,将激活的规则按顺序放入AgendaAgenda。e. e. 执行执行AgendaAgenda中的规则。重复步骤中的规则。重复步骤b b至至e e,直到执,直到执行完毕行完毕AgendaAgenda中的所有规则。中的所有规则。 效率问题 任何一个规则引擎都需要很好地解决规则的推理机制和规则条件匹配的效率问题 当引擎执行时当引擎执行时,会根据规则执行队列中的优先顺当引擎执行时,会根据规则执行队列中的优先顺序逐条执行规则执行实例,由于规则的执行部分序逐条执行规则执行实例,由于规则的执行部分可能会改变工作区的数据对象,从而会使队列中可能会改变工作区的数据对象,从而会使队列中的某些规则执行实例的某些规则执行实例 因为条件改变而失效,必须因为条件改变而失效,必须从队列中撤销,也可能会激活原来不满足条件的从队列中撤销,也可能会激活原来不满足条件的规则,生成新的规则执行实例进入队列。于是就规则,生成新的规则执行实例进入队列。于是就产生了一种产生了一种 动态动态 的规则执行链,形成的规则执行链,形成 规则的推规则的推理机制。这种规则的理机制。这种规则的 链式链式 反应完全是由工作区反应完全是由工作区中的数据驱动的。中的数据驱动的。 规则条件匹配的效率决定了引擎的性能规则条件匹配的效率决定了引擎的性能 规则条件匹配的效率决定了引擎的性能,引擎需要迅速测试工作区中的数据对象,从加载的规则集中发现符合条件的规则,生成规则执行实例。1982年美 国卡耐基梅隆大学的Charles L. Forgy发明了一种叫Rete算法,很好地解决了这方面的问题。目前世界顶尖的商用业务规则引擎产品基本上都使用Rete算法。Rete算法其核心Rete算法其核心思想是将分离的匹配项根据内容动态构造匹配树,以达到显著降低计算量的效果 Java规则引擎 目前主流的规则引擎组件多是基于Java和C+程序语言环境 Java规则引擎商业产品 Java规则引擎商业产品主要有(Jess不是开源项目,它可以免费用于学术研究,但用于商业用途则要收费)Java规则引擎商业产品主要有 Java规则引擎开源项目JBoss Rules(Drools ) 具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则, 从而检验是否已编码的规则执行了所需的业务规则。 Java规则引擎开源项目Mandarax是一个规则引擎的纯Java实现。它支持多类型的事实和基于反映的规则,数据库,EJB等等,支持XML标准(RuleML 0.8)。它提供了一个兼容J2EE的使用反向链接的接口引擎。JLisa是一个利用java构建商业规则的强大框架。它实现了JSR94 Rule Engine API。 Java规则引擎开源项目OpenRules OpenRules基于java完全开放源代码的商业规则管理框架。它有效的利用了MS Excel, Eclipse IDE 和其它java开源类库去构造,维护,部署,执行不同的复杂商业逻辑的规则引擎。 Java规则引擎开源项目JEOPS(The Java Embedded Object Production System)是一个基于Java的演绎法(Forward-Chaining)规则引擎.这个规则引擎被用于在Java 应用服务器,Java客户端程序,和Servlets中通过规则来提高它们的商业处理能力. Java规则引擎开源项目InfoSapientInfoSapient是一个开源的规则引擎.它设计用来表达,执行和维护在同一个公司中商业规则.InfoSapient基于纯Java开发,使用到 MVC,Visitor,Strategy,Facade,Factory Method,Observer,Iterator等设计模式. JRuleEngine JRuleEngine基于JSR94规范的java规则引擎。 Java规则引擎API(JSR-94) ava规则引擎API由javax.rules包定义,是访问规则引擎的标准企业级API。Java规则引擎API允许客户程序使用统一的方式和不同厂商 的规则引擎产品交互,就像使用JDBC编写独立于厂商访问不同的数据库产品一样。Java规则引擎API包括创建和管理规则集合的机制,在Working Memory中添加,删除和修改对象的机制,以及初始化,重置和执行规则引擎的机制。 Java规则引擎API体系结构 Java规则引擎API分为两个主要部分:运行时客户API(the Runtime client API)规则管理API(the rules administration API)。 异常与日志 规则引擎API定义了javax.rules.RuleException作为规则引擎异常层次的根类.所有其它异常都继承于这个根类.规则引擎中定义的 异常都是受控制的异常(checked exceptions),所以捕获异常的任务就交给了规则引擎。 规则引擎API没有提供明确的日志机制,但是它建议将Java Logging API用于规则引擎API。 规则语言 JSR 94中没有涉及用来创建规则和动作的语言.规则语言是规则引擎应用程序的重要组成部分,所有的业务规则都必须用某种语言定义并且存储于规则执行集中,从而 规则引擎可以装载和处理他们。名称及其网址列出如下 Rule Markup language (RuleML) http:/www.ruleml.org/ Simple Rule Markup Language (SRML) http:/xml.coverpages.org/srml.html Business Rules Markup Language (BRML) http:/xml.coverpages.org/brml.html SWRL: A Semantic Web Rule Language Combining OWL and RuleML http:/www.daml.org/2003/11/swrl/ Java规则引擎API使用示例 设置规则引擎 Java规则引擎的管理活动阶段开始于查找一个合适的javax.rules.RuleServiceProvider对象,这个对象是应用程序访问规则 引擎的入口。在J2EE环境中,你可能可以通过JNDI获得RuleServiceProvider。否则,你可以使用 javax.rules.RuleServiceProviderManager类: java codejavax.rules.RuleServiceProviderManager class: String implName = org.jcp.jsr94.ri.RuleServiceProvider; Class.forName(implName); RuleServiceProvider serviceProvider = RuleServiceProviderManager.getRuleServiceProvider(implName); 描述 拥有了拥有了RuleServiceProviderRuleServiceProvider对象,你就可以获得一个对象,你就可以获得一个javax.rules.admin.RuleAdministratorjavax.rules.admin.RuleAdministrator 类。从类。从RuleAdministratorRuleAdministrator类中,类中,你可以得到一个你可以得到一个RuleExecutionSetProviderRuleExecutionSetProvider,从类名可以知道,它用于,从类名可以知道,它用于创建创建 javax.rules.RuleExecutionSetsjavax.rules.RuleExecutionSets对象。对象。RuleExecutionSetRuleExecutionSet基本上是基本上是一个装入内存的,准备好执行的规则集合。一个装入内存的,准备好执行的规则集合。 包包javax.rules.adminjavax.rules.admin包括两个不同的包括两个不同的RuleExecutionSetProviderRuleExecutionSetProvider类。类。 RuleExecutionSetProviderRuleExecutionSetProvider类本身包括了从类本身包括了从SerializableSerializable对象创建对象创建RuleExecutionSetsRuleExecutionSets的方法,因此在规的方法,因此在规 则引擎位于远程服务器的情况则引擎位于远程服务器的情况下,仍然可以使用下,仍然可以使用RuleExecutionSetProviderRuleExecutionSetProvider类,构造器的参数可以通类,构造器的参数可以通过过RMIRMI来传递。另一个类是来传递。另一个类是 LocalRuleExecutionSetProviderLocalRuleExecutionSetProvider,包含了,包含了其他方法,用于从非其他方法,用于从非SerializableSerializable资源(如资源(如 java.io.Readerjava.io.Reader本地文件)本地文件)创建创建RuleExectionSetsRuleExectionSets。假设拥有了一个。假设拥有了一个RuleServiceProviderRuleServiceProvider对象,你对象,你可以从可以从 本地文件本地文件rules.xmlrules.xml文件创建一个文件创建一个RuleExectionSetRuleExectionSet对象。如以对象。如以下的代码所示:下的代码所示:java codeRuleAdministratorRuleAdministrator admin = admin = serviceProvider.getRuleAdministratorserviceProvider.getRuleAdministrator(); (); HashMapHashMap properties = new properties = new HashMapHashMap(); (); properties.put(nameproperties.put(name, , My Rules); My Rules); properties.put(descriptionproperties.put(description, A trivial , A trivial rulebaserulebase); ); FileReaderFileReader reader = new reader = new FileReader(rules.xmlFileReader(rules.xml); ); RuleExecutionSetRuleExecutionSet ruleSetruleSet = null; try = null; try LocalRuleExecutionSetProviderLocalRuleExecutionSetProvider lresplresp = = admin.getLocalRuleExecutionSetProvider(propertiesadmin.getLocalRuleExecutionSetProvider(properties); ); ruleSetruleSet = = lresp.createRuleExecutionSet(readerlresp.createRuleExecutionSet(reader, , properties); finally properties); finally reader.closereader.close(); (); 接下来,你可以使用RuleAdministrator注册获得的RuleExecutionSet,并给它分配一个名称。在运行时,你可以用同一个名称 创建一个RuleSession;该RuleSession使用了这个命名的RuleExecutionSet。参见下面的用 法:admin.registerRuleExecutionSet(rules, ruleSet, properties); 执行规则引擎 在运行时阶段,你可以参见一个在运行时阶段,你可以参见一个RuleSessionRuleSession对象。对象。RuleSessionRuleSession对象对象基本上是一个装载了特定规则集合的规则引擎实例。你从基本上是一个装载了特定规则集合的规则引擎实例。你从 RuleServiceProviderRuleServiceProvider得到一个得到一个RuleRuntimeRuleRuntime对象,接下来,从对象,接下来,从javax.rules.RuleRuntimejavax.rules.RuleRuntime得到得到 RuleSessionRuleSession对象。对象。 RuleSessionRuleSession分为两类:分为两类:statefulstateful和和statelessstateless。它们具有不同的功能。它们具有不同的功能。StatefulRuleSessionStatefulRuleSession的的 Working MemoryWorking Memory能够在多个方法调用期间保能够在多个方法调用期间保存状态。你可以在多个方法调用期间在存状态。你可以在多个方法调用期间在Working MemoryWorking Memory中加入多个中加入多个对象,然后执行引擎,接下来还可以加入更多的对象并再次执行引擎。对象,然后执行引擎,接下来还可以加入更多的对象并再次执行引擎。相反,相反,StatelessRuleSessionStatelessRuleSession类是不保存状态类是不保存状态 的,为了执行它的的,为了执行它的executeRulesexecuteRules方法,你必须为方法,你必须为Working MemoryWorking Memory提供所有的初始数据,提供所有的初始数据,执行规则引擎,得到一个内容列表作为返回值。执行规则引擎,得到一个内容列表作为返回值。下面的例子中,我们创建一个StatefulRuleSession实例,添加两个对象(一个Integer和一个String)到Working Memory,执行规则,然后得到Working Memory中所有的内容,作为java.util.List对象返回。最后,我们调用release方法清理RuleSession: 执行规则引擎RuleRuntimeRuleRuntime runtime = runtime = rsp.getRuleRuntimersp.getRuleRuntime(); (); StatefulRuleSessionStatefulRuleSession session = session = ( (StatefulRuleSessionStatefulRuleSession) ) runtime.createRuleSession(rulesruntime.createRuleSession(rules, properties, , properties, RuleRuntime.STATEFUL_SESSION_TYPERuleRuntime.STATEFUL_SESSION_TYPE); ); session.addObject(newsession.addObject(new Integer(1); Integer(1); session.addObject(Asession.addObject(A string); string); session.executeRulessession.executeRules(); List results = (); List results = session.getObjectssession.getObjects(); (); session.releasesession.release(); ();
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号