规则引擎(DROOLS)培训
DROOLS培训5天
目的
重点讲解DROOLS是什么、能做什么、工作流程、怎么用到系统中让学习人员可以对DROOLS有个全面初步的了解并能够用DROOLS进行简单的系统开发。
参加人员
需要使用DROOLS进行系统设计和开发或者对DROOLS感兴趣的同事。
主讲人员
第一章DROOLS入门
第1节什么是DROOLS
如何组织企业应用中的业务逻辑如果靠手工的代码来解决。随着大量业务规则的变化导致应用程序不停的变更如何能找到一种解决商业逻辑的架构来解决当商务规则不停的变化时可以保证我们的应用系统具有较好的柔韧性可以适应特定的商务规则的变化而无需修改我们的应用系统。 Drools就是这样的一个应用在商务逻辑层的架构。
CODEHAUS的一个开源项目叫DroolsDrools是为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给商业计划的执行带来的阻力和它带来的利益一样多。不幸的是在开发团队完全理解商业决策规则并实现之前规则已经改变了。在软件进入市场前它已经过时了需要进行重构以满足新的业务需求。如果你是一个开发人员你会知道我在说什么。再也没有比在需求变动的情况下构造软件让开发人员更沮丧的事情了。作为软件开发人员你必须象业务人员一样了解业务有时还要了解更多。
试想一下你是一位商业决策者。假如公司的成功依赖于你对于市场趋势敏锐的洞察力它常常帮助你领先于竞争者利用变化的市场环境获利。每天你都会得到更多更好的市场信息但并不要紧。完成新产品开发可能需要69个月在此期间对于市场大胆和敏锐的洞察和信息优势可能已经浪费了。而且 当产品发布时有这样几种可能产品没有什么吸引人的特性预算超支过了产品的最佳发布期限或三者兼而有之。
情况可能还会更糟在完成产品开发时市场环境和规划产品开发时相比 已经发生了根本变化。现在你必须要遵守新的规则你已经丧失了你的边际优势而且设计软件的五人中的三人已经离开了公司。你必须给接手的新人重新讲解复杂的业务。如果事情不顺利你可能发现自己要对付一个缺少文档并且你完全不了解的遗留应用。
你的战略在哪出现了问题你在哪里应该可以做到更好最近的轻量级软件过程如极限编程敏捷软件开发等都在强调自动单元测试和软件功能优先级的重要性。除此之外还有其他的原则你的开发团队可能也很熟悉这些原则可以帮助他们对需求的变动做出迅速反应并缩短项目的开发周期。这些原则的大多数如系统分解多年前就已经出现并得到了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
CloudServer是一家新的VPS主机商,成立了差不多9个月吧,提供基于KVM架构的VPS主机,支持Linux或者Windows操作系统,数据中心在美国纽约、洛杉矶和芝加哥机房,都是ColoCrossing的机器。目前商家在LEB提供了几款特价套餐,最低月付4美元(或者$23.88/年),购买更高级别套餐还能三个月费用使用6个月,等于前半年五折了。下面列出几款特别套餐配置信息。CPU:1cor...
易探云怎么样?易探云(yitanyun.com)是一家知名云计算品牌,2017年成立,从业4年之久,目前主要从事出售香港VPS、香港独立服务器、香港站群服务器等,在售VPS线路有三网CN2、CN2 GIA,该公司旗下产品均采用KVM虚拟化架构。目前,易探云推出免备案香港物理机服务器性价比很高,E3-1230 8 核*1/16G DDR3/SATA 1TB/香港BGP线路/20Mbps/不限流量,仅...
Hostiger商家我们可能以前也是有见过的,以前他们的域名是Hostigger,后来进行微调后包装成现在的。而且推出Columbus Day哥伦布日优惠活动,提供全场的VPS主机首月7折月付2.79美元起的优惠。这里我们普及一下基础知识,Columbus Day ,即为每年10月12日,是一些美洲国家的节日,纪念克里斯托弗·哥伦布在北美登陆,为美国的联邦假日。Hostiger 商家是一个成立于2...