议程JBossDrools介绍HelloDroolsDroolsRuleLanguageDomainSpecificLanguageFlowDroolsGuvnorDrools简介Drools是Redhat公司JBoss业务逻辑智能模块。Drools是处理规则的专家系统。客户端包含业务规则的业务逻辑组件业务规则调用传统业务逻辑编写方式客户端业务逻辑组件调用引入规则引擎后业务逻辑组件的编写方式调用规则引擎业务规则引入规则引擎之前引入规则引擎之后4RuleEngine的优势声明式编程RuleEngine允许你说“做什么”,而不是“怎样去做”Rule系统能解决非常困难的难题逻辑和数据分离快捷和灵活Knowledge集中化工具集成良好的解释机制易于理解的Rule例子If(“Joe”.equal(people.getName())){if(“Male”.equal(people.getSex())){System.out.priltln(“Thisisaman,nameisJoe.”);}}ruleGoodByewhenPeople(name=”Joe”,sex=”Male”)thenSystem.out.println((“Thisisaman,nameisJoe.”);endJava语言表示,如果有一个人的名字是“Joe”,而且是个男性,就会输出他的名字跟性别。产生背景系统庞大,业务复杂;业务规则经常改变;24小时服务;业务统一管理;降低系统维护升级成本。知识背景生产式规则引擎Rete算法产生式规则引擎许多产品规则系统的大脑实际上就是一个推理引擎,用于匹配facts和rules当匹配被找到,ruleactions被fireActions经常会改变facts的状态,或者在应用上执行一些“外部”actionRETE网络节点简单的RETE网络JoinNode更复杂的网络AgendaDrools是如何工作的?RuleRuleRuleRuleRuleFactFactFactFactFactWorkingMemory3.AssertFactsRuleBaseFactFactFactFactFactRuleRuleRuleRuleRule2.Create5.FireAllRules(5)activation-consequence1.ParseDRLActivationRuleFactActivationRuleFactFact议程JBossDrools介绍HelloDroolsDroolsRuleLanguageDomainSpecificLanguageFlowDroolsGuvnor配置开发环境到JbossDrools官网的下载频道下载一下资料:DroolsBinaries(Required)DroolsEclipseWorkbench(Required)DocumentationJavadocsSourceCode……配置开发环境解压DroolsBinaries,到路径{Drools_Home}。解压DroolsEclipseWorkbench,把features和plugins放到{Eclipse_Home}\dropins文件夹下。打开Eclipse,到WindowPreferenceDroolsInstallDroolsRuntimes,给Eclipse指定Drools的安装路径{Drools_Home}。新建HelloDrools项目打开Eclipse新建项目窗口,FileNewOther…选择DroolsDroolsProject,打开新建Drools项目窗口。输入项目名称,点Next进入下一页面。勾上第1、2项,生成一个HelloWorld的例子。点Finish完成。执行结果Debug规则文件议程JBossDrools介绍HelloDroolsDroolsRuleLanguageDomainSpecificLanguageFlowDroolsGuvnor规则文件种类DRL–DroolsRulesLanguage高级别的表达式语言(适合高级用户)XML–Drools2.xFormatXML结构化规则DSL–DomainSpecificLanguage领域语义规则模板支持自然语言DecisionTables(决策表)对业务分析人员非常有用Excel,ImpressorCSV自定义UI界面挑选关键元素适合最终用户操作DRLimportcom.sample.Stock;ruleIdentifyHotBuysno-looptruesalience10whenstock:Stock(indexName==DJIA,currentPrice=100.0,technicalScore=10.1,fundamentals=62.5,attractiveness=87.2)thenlog(BUY:+stock);stock.setFlag(true);stock.setAction(BUY);modify(stock);endpackagecom.sample;publicclassStock{enumAction{BUY,HOLD,SELL};publicStringgetIndexName();publicBigDecimalgetCurrentPrice();publicvoidsetCurrentPrice(BigDecimalp);…publicvoidsetFlag(booleanflag);publicvoidsetAction(Stock.Actionaction);}FactStock.javaRuleStockPicker.drl术语:RuleConditionConsequenceFactXMLDSL–DomainSpecificLanguagesrulePlatinumPriority#wedon'twanttomakethehighrollerswait!whenThereisaPlatinumcustomerwithaticketstatusofNewthenEscalatetheticketendruleEscalatewhenThereisacustomerticketwithstatusofEscalatethenSendescalationemailendDecisionTables解析ExcelXLS和CSV(OpenOffice)一个DRL范例剖析DRL文件Package不必匹配目录结构ExpanderDsl文件列表ImportsFact类型/领域对象的列表Facts被插入workingmemory(通过insertAPI)Globals被命名的“变量”值能在workingmemory中设置(通过setGlobalAPI)大多用于返回结果,或者作为引用数据在LHS中使用要注意(应该为常量结果,且是幂等的)Functions即一段语义代码(java)能够在LHS中的eval或者predicate谓词表达式中使用,或者在RHS中。Rules30Globals是一个命名变量可传递常量或者工具(服务)可作为结果返回,尤其是返回集合结果的途径当Global变量是数字、字符或字符串类型时,在规则中是不能被改变的。不应该当做facts的替换使用RHS中的修改不会影响到LHS中的conditions如果在LHS中使用,必须在facts插入前设置函数(Functions)可在规则LHS或者RHS中添加各种逻辑对字段的控制或者转换,小计算公式特别有用剖析Rule33剖析Rule一个rule由conditions,和actions组成。当所有的conditions匹配,rule可能“fire”Conditions即LHS(lefthandside)Actions即RHS(righthandside或者consequence)Rule操纵应用程序中的fact(数据)Facts(事实)POJOs(PlainOldJavaObjects)插入workingmemory.Hibernateand/orEJB3整合POJOs和DatabaseCommunication修改POJO’s状态/属性变化被告知rulesengine或者使用propertychangelistenerLong-livedworkingmemory持久的statefulsessionbeanShort-livedworkingmemory插入,计算,处理statelesssessionbeanpublicclassStock{privateStringsymbol;privateStringindexName;privatefloatcurrentPrice;publicStringgetSymbol(){returnthis.symbol;}publicvoidsetSymbol(Stringsymbol){this.symbol=symbol;}publicStringgetIndexName(){returnthis.indexName;}publicvoidsetIndexName(StringindexName){this.indexName=indexName;}publicfloatgetCurrentPrice(){returnthis.currentPrice;}publicvoidsetCurrentPrice(floatcurrentPrice){this.currentPrice=currentPrice;}Conditions/LHSRule的LHS由模式(Patterns)和条件元素(ConditionalElements—CE)组成Patterns被用来指示出fact的字段约束每个约束必须为true才能让RHS的actionsfire模式(Patterns)没有字段约束的PatternPerson()有文本字段约束的PatternPerson(name==“bob”)字段绑定的PatternPerson($name:name==“bob”)变量名称可以是任何合法的java变量,$是可选的,可由于区分字段和变量Fact绑定的Pattern$bob:Person(name==“bob”)变量约束的PatternPerson(name==$name)条件元素(ConditionalElements)应用在Pattern上and对于顶级(非嵌套)patterns是隐式成立的可以显式and使用关键字’and’(不推荐使用&&)or列能被显式or使用关键字’or’(不推荐使用||)重要:’or’内部会为LHS中的每个逻辑分支生成一个rule,如果逻辑分支之间不互斥,rule可能会被多次fire条件元素的例子其他的条件元素(ConditionalElements)ExistsNotAccumulateCollectFromForallConsequence/RHS即一段代码JavaMVEL典型actions:插入新的fact修改已经存在的fact撤销fact为fact的字段赋值为global赋值进行GC警告:使用java的时候。不要使用if/else,for/whileloops或者其他类似的java逻辑Consequence/RHS特有关键字update(fact)insert(newfact())retract(fact)访问KnowledgeHelper——drools.XXXgetRule比如:System.out.println(dr