规则规则引擎(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

御云(RoyalYun):香港CN2 GIA VPS仅7.9元每月起,美国vps仅8.9/月,续费同价,可叠加优惠

御云怎么样?炎炎暑期即将来临,御云(royalyun)香港、美国服务器开启大特惠模式。御云是新成立的云服务提供商,主要提供香港、美国的云服务器,不久将开启虚拟主机业务。我们的香港和美国主机采用CN2 GIA线路。目前,香港cn2 gia vps仅7.9元每月起,美国vps仅8.9/月,续费同价,可叠加优惠,香港云服务器国内延迟一般在50ms左右,是搭建网站的最佳选择,但是请不要用于违法用途。点击进...

SoftShellWeb:台湾(台北)VPS年付49美元起,荷兰VPS年付24美元起

SoftShellWeb是一家2019年成立的国外主机商,商家在英格兰注册,提供的产品包括虚拟主机和VPS,其中VPS基于KVM架构,采用SSD硬盘,提供IPv4+IPv6,可选美国(圣何塞)、荷兰(阿姆斯特丹)和台湾(台北)等机房。商家近期推出台湾和荷兰年付特价VPS主机,其中台湾VPS最低年付49美元,荷兰VPS年付24美元起。台湾VPSCPU:1core内存:2GB硬盘:20GB SSD流量...

raksmart:香港机房服务器实测评数据分享,告诉你raksmart服务器怎么样

raksmart作为一家老牌美国机房总是被很多人问到raksmart香港服务器怎么样、raksmart好不好?其实,这也好理解。香港服务器离大陆最近、理论上是不需要备案的服务器里面速度最快的,被过多关注也就在情理之中了。本着为大家趟雷就是本站的光荣这一理念,拿了一台raksmart的香港独立服务器,简单做个测评,分享下实测的数据,仅供参考!官方网站:https://www.raksmart.com...

规则引擎为你推荐
iphone5解锁苹果5手机怎么解屏幕锁bbsxp老大!!您好!我是初学者!请问我的bbsxp如何更改顶端左面的LOGO??vista系统重装Vista系统的重装的步骤,有系统恢复盘依赖注入什么是侵入性?还有依赖注入?arm开发板开发板是什么?如ARM开发板,DSP开发板等。。它和最终目标板有何区别?iphone6上市时间苹果六什么时候出的网管工具网吧工具有什么?怎么在图片上写文字怎么才能在图片上写字呢空间装扮免费QQ空间的哪些装扮是免费的nokia最新手机诺基亚手机最新款2017怎么样
免费网站空间 韩国vps俄罗斯美女 过期域名抢注 重庆服务器托管 cve-2014-6271 韩国加速器 哈喽图床 2017年黑色星期五 免费个人博客 国外空间 hostloc qq云端 美国网站服务器 服务器监测 彩虹云 个人免费邮箱 photobucket 免费个人主页 privatetracker 月付空间 更多