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

规则引擎  时间:2021-02-25  阅读:()

规则引擎(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, thatmeans it can scale to incorporate and execute hundreds of thousandsof 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规则引擎这个就是来解决我们上述问题的框架。

第3节为什么使用DROOLS

软件应用领域充满了变化。在技术领域里 IT从业人员也在不断探索各种软件方法学来适应用的变化如快速软件开发极限编程敏捷软件开发等它们无一例外地强调灵活和变化的重要性。

虽然IT团队反应迅速但他们通常带来"电话效应"―IT给商业计划的执行带来的阻力和它带来的利益一样多。不幸的是在开发团队完全理解商业决策规则并实现之前规则已经改变了。在软件进入市场前它已经过时了需要进行重构以满足新的业务需求。如果你是一个开发人员你会知道我在说什么。再也没有比在需求变动的情况下构造软件让开发人员更沮丧的事情了。作为软件开发人员你必须象业务人员一样了解业务有时还要了解更多。

试想一下你是一位商业决策者。假如公司的成功依赖于你对于市场趋势敏锐的洞察力它常常帮助你领先于竞争者利用变化的市场环境获利。每天你都会得到更多更好的市场信息但并不要紧。完成新产品开发可能需要69个月在此期间对于市场大胆和敏锐的洞察和信息优势可能已经浪费了。而且 当产品发布时有这样几种可能产品没有什么吸引人的特性预算超支过了产品的最佳发布期限或三者兼而有之。

情况可能还会更糟在完成产品开发时市场环境和规划产品开发时相比 已经发生了根本变化。现在你必须要遵守新的规则你已经丧失了你的边际优势而且设计软件的五人中的三人已经离开了公司。你必须给接手的新人重新讲解复杂的业务。如果事情不顺利你可能发现自己要对付一个缺少文档并且你完全不了解的遗留应用。

你的战略在哪出现了问题你在哪里应该可以做到更好最近的轻量级软件过程如极限编程敏捷软件开发等都在强调自动单元测试和软件功能优先级的重要性。除此之外还有其他的原则你的开发团队可能也很熟悉这些原则可以帮助他们对需求的变动做出迅速反应并缩短项目的开发周期。这些原则的大多数如系统分解多年前就已经出现并得到了Jav a平台的支持如JMX等还有如面向对象和角色建模 已经内建在Java语言中。

为什么你的开发团队不得不像商业经理人一样在代码中包含复杂微妙的商业决策逻辑呢你怎样才能向他们解释决策推理的微妙之处呢你这样做是否谨慎呢可能不是。为什么要冒这样的风险让应用代码或测试代码错误地表达你的商业决策逻辑呢如果这样做的话你怎样检查它们的正确性呢---难道你自己想学习如何编程和编写测试代码或者你的客户会为你测试软件你一方面要应付市场一方面要应付软件代码这实在太困难了。

如果使用DROOLS开发系统就能将这些商业决策规则集中地放在一个地方 以一种你可以理解的格式定义让你可以直接管理而不是散落在代码的各个角落。这样你就能把商业决策规则独立于你的软件代码让开发团队做出技术决策你将会获得更多好处。你的项目开发周期会更短软件对于变动的需求更灵活。

第4节什么样的系统适合用DROOLS

既然DROOLS可以使程序更灵活适应变化的能力更强是否所有的系统都适合用DROOLS开发呢回答是否定的

是否需要用DROOLS需要考虑一下问题

第一我的应用程序有多复杂?

对于那些只是把数据从数据库中传入传出并不做更多事情的应用程序最好不要使用规则引擎。但是当在Java中有一定量的商业逻辑处理的话可以考虑Drools的使用。这是因为很多应用随着时间的推移越来越复杂而Drools可以让你轻松应对这一切。

第二我的应用的生命周期有多久这个问题的正确答案往往是“令人惊讶的长”――还记得那些认

为他们的程序不会苟活到2000年的大型机的程序员吗使用规则引擎将会在中长期得到好处。像这篇文章所展示的那样甚至原型都能从Drools与灵活方法的组合中获益让“原型系统”转化成生产系统。

第三我的应用需要改变吗唯一能确定的是你的需求将会改变无论是在开发过程中或是在开发完成以后。 Drools使用一个或多个简单的DRL文件帮你来应对这一切。

第5节规则引擎的框架结构

Drools分为两个主要部分构建 Authoring 和运行时 Runtime 。构建首先会使用DRL文件进行创建规则。运行时要构造出fact把fact放入working memory进行规则匹配。

1 Production memory

规则加载流程

首先创建xml或drl规则文件将规则文件加载到Parser(解析器)中产生中间结构descr使用Package Builder对中间结构descr进行执行和编码并且返回package对象。 package对象中包含1个或者多个规则。

RuleBase是一个运行时组件它包含了一个或多个Package对象。

RuleBase中可以包含一个或者多个package对象并且可以在任何时刻将一个Package对象加入或移出RuleBase对象 RuleBase可以在任何时刻创建一个或者多个Working Memory对象。

2 WorkingMemory

WorkingMemory是运行时规则引擎的主要类。 它保持了所有被 asserted进WorkingMemory的数据的引用直到取消 retracted  。 WorkingMemory是有状态对象。

它们的生命周期可长可短。如果从一个短生命周期的角度来同一个引擎进行交互意味着你可以使用RuleBase对象来为每个session产生一个新的WorkingMemory 然后在结束session后discard这个WorkingMemory 产生一个WorkingMemory是一个廉价的操作。另一种形式就是在一个相当长的时间中 例如一个conversation  保持一个WorkingMemory  并且对于新的 facts保持持续的更新。 当你希望 dispose一个WorkingMemory的时候最好的实践就是调用dispose()方法此时RuleBase中对它的引用将会被移除尽管这是一个弱引用 。不管怎样最后它将会被当成垃圾收集掉。术语WorkingMemory Actions代表了对WorkingMemory 的 assertions  retractions和modifications 。

2. 1 Facts

Facts是从你的应用中被assert进WorkingMemory中的对象 beans  。 Facts是规则可以访问的任意的java对象。规则引擎中的facts并不是“ clone ” facts 它只是持有到你的应用中数据的引用。 Facts是你的应用数据。 String和其他没有getter和setter的类不是有效的Fact 。这样的类不能使用域约束 Field Constraints   因为使用域约束要依靠JavaBean标准的getter和setter来同对象交互。

2.2 Assertion

“Assertion”是将facts加入事实库的动作例如WorkingMemory.assertObject(yourObject) 。当你assert一个fact 它将被检查是否匹配规则。这意味着所有的匹配工作将会在assert的过程中完成。尽管如此 当你完成assert facts之后你还要调用“ fireAllRules() ”方法来执行规则。

当一个对象被assert后会返回一个FactHandle 。这个FactHandle是一个代表在Working Memory中你的asserted Object的令牌 token  。当你希望retract或者modify一个对象的时候这个令牌让你用来同WorkingMemory进行交互。

Cheese stilton = new Cheese( " stilton " ) ;

FactHandle stiltonHandle = workingMemory.assertObject( stilton ) ;

WorkingMeomry有两种 assertion模式 Equality和 Identity 默认是Identity  。

Identity模式下WorkingMemory使用一个IdentityHashMap来存储所有的assertedObjects 。这个模式下 当 asserted的 Object是同一个实例时 它返回同一个FactHandle 。

Equality模式下 WorkingMemory使用一个 HashMap来存储所有的 assertedObjects 。这个模式下 当asserted的Object相等时它返回同一个FactHandle 。

WorkingMemory.assertObject(yourObjcet) 只是进行assertion的一种regular方法还存在有一种称为logical assertion的动作。

2.3 Retraction

基本上就是assert的逆操作。当你retract一个fact  WorkingMemory将不再跟踪那个fact 。任何被activated并依赖那个fact的规则将被取消。注意完全有可能存在某条规则是依赖于一个fact的“不存在”  non existence  。在这种情况下 retract一个fact将导致一条规则被激活。对一个Fact进行Retraction 必须用assert时返回的那个FactHandle做为参数。

Cheese stilton = new Cheese( " stilton " ) ;

FactHandle stiltonHandle = workingMemory.assertObject( stilton ) ;

workingMemory.retractObject( stiltonHandle ) ;

2.4 Modification

当一个Fact被修改了会通知规则引擎进行重新处理。在规则引擎内部实际上是对旧的Fact进行retract 然后对新的Object再进行assert 。要使用modifyObject()方法来通知Working Memory  被改变的 Object并不会自己通知规则引擎。注意modifyObject()方法总是要把被修改的Object做为第二参数这就允许你把一个不可变对象替换为另一个新对象。

Cheese stilton = new Cheese( " stilton " ) ;

FactHandle stiltonHandle = workingMemory.assertObject( stilton ) ;

stilton. setPrice( 100 ) ;workingMemory.modifyObject( stiltonHandle, stilton ) ;

2.5 Globals

Global是一个能够被传进WorkingMemory但不需要assert的命名对象。大多数这些对象被用来作为静态信息或服务。这些服务被用在一条规则的RHS 或者可能是从规则引擎返回对象的一种方法。

List list = new ArrayList  ;workingMemory. setGlobal ( " list " , list) ;setGlobal ()方法传进去的命名对象必须同RuleBase中所定义的具有相同的类型就是要同你的规则文件中用 Global关键字所定义的类型相同  否则会抛出一个RuntimeException 。如果一条规则在你setGlobal之前调用了定义的Global 会抛出一个NullPointerException 。

2.6 Property Change Listener

如果你的 fact对象是 JavaBean  你可以为它们实现一个 property changelistener 然后把它告诉规则引擎。这意味着当一个fact改变时规则引擎将会自动知道并进行响应的动作你不需要调用modifyObject()方法来通知WorkingMemory  。Proxy libraries将会帮助实现这一切。要让Property Change Listener生效还要将fact设置为动态 dynamic 模式通过将true做为assertObject()方法的第二个参数来实现

Cheese stilton = new Cheese( " stilton " ) ;

FactHandle stiltonHandle = workingMemory.assertObject( stilton, true ) ; // specifies that this is a dynamic fact

然后要在 JavaBean 中加入一个 PropertyChangeSupport实例 和两个方法addPropertyChangeListener()和removePropertyChangeListener() 。最后要在JavaBean

RackNerd 2022春节促销提供三款年付套餐 低至年付10.88美元

RackNerd 商家我们应该是比较熟悉的商家,速度一般,但是人家便宜且可选机房也是比较多的,较多集中在美国机房。包括前面的新年元旦促销的时候有提供年付10美元左右的方案,实际上RackNerd商家的营销策略也是如此,每逢节日都有活动,配置简单变化,价格基本差不多,所以我们网友看到没有必要囤货,有需要就选择。RackNerd 商家这次2022农历新年也是有几款年付套餐。低至RackNerd VPS...

georgedatacenter:美国VPS可选洛杉矶/芝加哥/纽约/达拉斯机房,$20/年;洛杉矶独立服务器39美元/月

georgedatacenter怎么样?georgedatacenter这次其实是两个促销,一是促销一款特价洛杉矶E3-1220 V5独服,性价比其实最高;另外还促销三款特价vps,大家可以根据自己的需要入手。georgedatacenter是一家成立于2019年的美国vps商家,主营美国洛杉矶、芝加哥、达拉斯、新泽西、西雅图机房的VPS、邮件服务器和托管独立服务器业务。georgedatacen...

tmhhost:全场VPS低至6.4折,香港BGP200M日本软银美国cn2 gia 200G高防美国三网cn2 gia韩国CN2

tmhhost放出了2021年的端午佳节+618年中大促的优惠活动:日本软银、洛杉矶200G高防cn2 gia、洛杉矶三网cn2 gia、香港200M直连BGP、韩国cn2,全都是高端优化线路,所有这些VPS直接8折,部分已经做了季付8折然后再在此基础上继续8折(也就是6.4折)。 官方网站:https://www.tmhhost.com 香港BGP线路VPS ,200M带宽 200M带...

规则引擎为你推荐
明星论坛谁能介绍几个关于明星的好看图片网站啊.?刷网站权重如何提高网站权重和流量赵雨润星辰变电影是真的启动了吗?站长故事部队里什么是站长?最低是什么级别?都有哪些级别啊?二叉树遍历二叉树三种遍历方式原则?百度手写百度输入法切换手写 百度汉王手写输入法手机区号有的手机号中间的号码是地区区号,那是什么卡显卡温度多少正常显卡温度多少算正常淘宝店推广如何推广淘宝店网易公开课怎么下载如何下载网易公开课
空间域名 花生壳免费域名 金万维动态域名 主机 paypal认证 表单样式 evssl证书 青果网 国外php空间 亚洲小于500m 183是联通还是移动 699美元 秒杀汇 泉州移动 phpmyadmin配置 爱奇艺会员免费试用 web服务器搭建 美国盐湖城 学生服务器 美国迈阿密 更多