`
dengkane
  • 浏览: 42350 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Drools扫盲普及贴

阅读更多
一花一世界,一叶一菩提




一 前言 

     最早对Drools感兴趣,是起源于规则引擎.当时是希望能找一个开源工具来做一些规则的处理. 

     在官方网站上翻了半天资料,却发现Drools一直在强调它不只是一个简单的规则引擎,而是更多的引入工作流的概念. 
     之后最大的感触就是Drools牵涉到的东西比较多,甚至有一种依照Drools可以创造整个世界的感觉-- 这个世界本身不就是由各种规则/流程/事件构成的么? 这也是本文标题的由来. 

     以后会对Drools的各方面有一个比较深入的了解,因此这篇文章只是用来做简单的介绍,希望能在短时间内能让其他人对Drools做什么,怎么做,有一个直观的了解,以后遇到相关应用的场景时,能想到Drools的解决方案. 

    PS:PPT是在Team内部的团队分享时使用的,有一些链接可能会失效(外网无法访问).本文内容和PPT不会完全一致.不过问题不大了. 



二.从规则引擎的应用场景说起 

     昨天讲解PPT的时候有人问到Drools和If-else的本质区别在哪里.我想了想,还是想引用一句话来表述自己的感受.
          "南京一高职学生为了给男友发鲸鱼宝宝的短信涉嫌伪造健康证明捐精买iphone4。。。。" 

     
2.1 各种棋类游戏 

     象棋围棋五子棋跳棋军棋扑克牌三国杀杀人游戏强权外交等等等等.游戏本身就是规则的代名词. 

2.2 业务规则 
     超市打折,汇率计算等等等等. 
  
2.3 相通的场景 

     这些场景可能有一些相通的点,在这儿我可能总结的不会太全面,稍稍罗列一下: 
   
   

  •      单条规则相对简单
  •      规则数量相对庞大
  •      规则之间会有冲突
  •      一条规则本身会触发另一条规则
  •      规则有可能会产生变动(很多时候可能唯一需要变动的就是规则)


    
    这个时候用规则引擎来处理这些事情就相对来说容易多了.不过,Drools做的远远不止这些. 


    
三 Drools的构成.    

    目前Drools的最新稳定版本是5.2.0.Final(23-Jun-2011). 现在由JBoss维护,分成五个模块. 

     下面就简单的介绍下每一个模块的内容,可以大致的了解下Drools的发展方向和可以用来解决问题的范畴.    

3.1 Guvnor     

     Guvnor是一个通过Web界面可以管理,更改规则的工具,也可以提供Repository的服务.(似乎各种开源软件里都会提供这样的Web管理界面,Heritrix,Nutch,AllGeography等等等等).支持Dsl和QA.  
     
3.2 Expert          

     传统的规则引擎,应该说Drools的核心,也是前身.通过Rete算法来实现模式匹配. 
     
3.3 Jbpm5 

     工作流的处理交给了JBPM5这个模块.这个模块我了解的不多,大概知道的是除了工作流之外还提供了各种各样的集成(Camel,Spring,Osgi等等,感觉这个模块本身的规划不是特别清晰).其中Camel适用于路由转发.有了解的较多的朋友可以指教一下,或者以后有时间我会再了解一下相关的内容.      
      
3.4 Fusion 

     用于做CEP的处理.本来是不太懂CEP的,这个概念接触的不算多.不过看到了Wiki上的一个例子,大概明白一些. 
     摘录如下: 
    

引用
    
Among thousands of incoming events, a monitoring system may for instance receive the following three from the same source: 
1.church bells ringing. 
2.the appearance of a man in a tuxedo with a woman in a flowing white gown. 
3.rice flying through the air. 

From these events the monitoring system may infer a complex event: a wedding 
  

    

        

    
3.5 Planner   
  
    Planer用来解决一系列的问题,如N皇后问题,TSP 
(话说这些问题有什么共同点我还没有领会得到,大体的感觉是可以用来解决一些规划问题,或者是说求解问题). 

   

3.6 关系图     

    这是我理解的关系图. 
     
      
     
    Expert还是核心,Fusion和Planer和Workflow都应该是规则的应用到具体领域的扩展,通过JBPM5还提供了和各种开源软件的集成.Guvnor来提供各种资源的管理. 


   




四 Expert   

   对Expert有了解就可以使用Drools了.所以我想还是总体的介绍下Expert的使用,这样具体的细节其他朋友可以通过翻阅手册来自己解决了. 

    列出几个知识点: 

    1.Drl文件. 
          Drl就是Drools用来描述规则的文件.DRL文件的结构包括以下几部分: 

引用

package package-name 
imports 
globals 
functions 
queries 
rules 

     
      

       Drl中可以通过Import的方式引入Model类,也可以调用Java的各种函数. 
       Drl中也可以自己定义Class和Function. 
       Queries的应用场景还不太了解,目前没有用到过. 


       Rules就是规则的部分,它的结构如下: 

引用
  
rule "name" 
    attributes 
    when 
       LHS(The Rule Language) 
    then 
        RHS(Java,Pthyon,Groovy) 
end 



       
      每一条规则都有名称. 
      每一条规则都有属性(lock-on-active等) 
      When里写的是LHS(Left Hand Side,左手边),等同于IF里的条件判断.左手边是Drools自己的语法规则,详见Drools的文档. 
      Then里写的是RHS(Right Hand Side,右手边),等同于IF里的执行语句.右手边支持多种语言(Java,Pthyon,Groovy等). 

  2.规则文件的使用 

Java代码  收藏代码
  1. KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();  
  2. kbuilder.add(ResourceFactory.newClassPathResource("demo.drl"), ResourceType.DRL);  
  3.   
  4. KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();  
  5. kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());  
  6. StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();  
  7.   
  8. Employee employee=new Employee("段三品");  
  9. employee.setClockedAt(System.currentTimeMillis());  
  10.   
  11. ksession.insert(employee);  
  12. ksession.fireAllRules();  


          

Session分成两种,一种是StateFul,一种是StateLess.区别是StateFul是可以完成推理的,即一条规则有可能导致另一条规则的触发,因此需要显示的调用一下FireAllRules().而StateLess是不支持规则推理的.所以规则是自动触发. 




Employee 是一个简单的Demo类,用来表示一个员工.这里想给出的是一个判断员工上班是否迟到的示例,因此Employee可以设计成这个样子. 

  

Java代码  收藏代码
  1.  import java.io.Serializable;  
  2.   
  3. import org.apache.commons.lang.builder.ToStringBuilder;  
  4. import org.apache.commons.lang.builder.ToStringStyle;  
  5.   
  6. public class Employee  implements Serializable{  
  7.   
  8.     /** 
  9.      *  
  10.      */  
  11.     private static final long serialVersionUID = -2301765612395462099L;   
  12.       
  13.     private String name;  
  14.     private Long clockedAt;  
  15.     private boolean late;     
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.     public Long getClockedAt() {  
  23.         return clockedAt;  
  24.     }  
  25.     public void setClockedAt(Long clockedAt) {  
  26.         this.clockedAt = clockedAt;  
  27.     }  
  28.     public boolean isLate() {  
  29.         return late;  
  30.     }  
  31.     public void setLate(boolean late) {  
  32.         this.late = late;  
  33.     }  
  34.     public String toString() {  
  35.         return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);  
  36.     }  
  37.   
  38. }  
  39.   
  40.        




假设公司的迟到规则是九点钟以后打卡就算迟到,那么规则就可以写成这样子. 

Drools代码  收藏代码
  1. rule "迟到"     
  2.     lock-on-active  
  3.     when             
  4.          $employee: Employee(clockedAt > 9:00 )  
  5.     then       
  6.          $employee.setLate(true);   
  7. end  
  8.     


  
  将一个Model Insert进去,调用FireAllRules方法,就是执行了规则,Model的值就会发生改变. 
  这就是Expert使用的最简单的方式. 


  3.产生式系统 
     规则引擎里的一些术语是来自于产生式系统的.如LHS,RHS,Fact,ProductMemory,WorkingMemory. 
     LHS和RHS之前已经提到过,下面来介绍一下其它的术语. 
     Fact:每一条规则称之为Fact. 
     ProductMemory:保存Fact.如上例说到的迟到的规则. 
     WorkingMemory:保存每一个实例,如上例说到的每一个员工. 

    
    可以把规则引擎理成一个WorkingMemeory和ProductMemory的模式匹配.有四种算法.(Linear,Rete,Treat,Leap). 
    Drools使用的是Rete.据说也有Leap的实现,后来因为无人使用也无人维护给放弃了. 
    

    
  4.Rete     

      Rete是网络的意思,简单的说,Rete算法的思路就是事先将Fact构建成一个过滤网,这个过滤网由四种节点构成.分别是Root,1-input(alpha),2-input(beta),terminal. 

      这四个节点也比较简单,Root是入口,所有的实例都从Root出进入Rete.Alpha用来做Literal的验证(如"Name=段三品"),Beta节点用来做对象的验证,如(employee1=employee2),terminal是终止节点. 
   
     一直在想一个简单的方式能描述Rete做的功能.可以想象成从Root到Aplpha到Beta到Terminal是由不同的阀门构成的水管. 
     
    从Root处开始往下倒各种液体(水,酒,醋等等,等同于WorkingMemory的一个个实例),对于各个节点来说,如果满足自己的验证条件,那么就可以放行.如果不满足,就不通过.这样最后从Terminal流出的就是匹配到的规则. 

    昨天又有人问到这个和有限状态自动机的区别是什么.我想区别就在于每一个节点都保留了符合这个节点的WorkingMemory.而有限状态自动机是不会保存这些内容的. 

   以上是对Rete的简单理解,希望能有朋友多指教. 
   符上一张图(很遗憾忘记在哪儿粘过来的了,对原图的作者表示歉意). 
       


五 Guvnor   

   Guvnor这部分,我想说的主要是关于Dsl的部分. 
   Dsl其实大部分人已经经常用到了.只不过自己还不知道而已.如Shell,Uml,Sql,wiki Template. 
   Guvnor支持Dsl的配置,DSL configurations的选项里可以新建,编辑Dsl文件.这里给出一个Guvnor安装后自带的例子. 

Dsl代码  收藏代码
  1. [when]When the credit rating is {rating:ENUM:Applicant.creditRating} = applicant:Applicant(creditRating=="{rating}")  
  2.   [then]Approve the loan = applicant.setApproved(true)  
  3.     
  4.   [when]When the applicant dates is after {dos:DATE:default} = applicant:Applicant(applicationDate>"{dos}")  
  5.     
  6.   [when]When the applicant approval is {bool:BOOLEAN:checked} = applicant:Applicant(approved=={bool})  
  7.     
  8.   [when]When the ages is less than {num:1?[0-9]?[0-9]} = applicant:Applicant(age<{num})    
  9.   
  10.      




   这样在编辑规则的时候.就可以用Dsl语言去编写规则了.有助于将业务逻辑从代码中分离出去.将变化和非变化的部分分离开来. 


六. 小结  

    Drools对于规则的理解更深入,或者说是对于规则的应用理解更深入.当然这个世界是由什么来构成的,不可能有一个准确又有用的答案.可是至少在Drools的眼里,世界可以由规则组成. 

    有太多的内容没有涉及到了,所以还是希望这篇文章能够做到之前对Drools给出一个感性的认识,知道Drools能做什么事情,了解Drools怎么去做的.以后再面对项目需求时,在可以用到Drools的场景下,再去详细查证手册好了. 

    另外Drools的安装包本身包含大量的示例程序.Reference做的也相当不错.都是很好的资料. 

分享到:
评论
2 楼 dengkane 2017-10-20  
简单看可以认为是把 IF ELSE 做简化,其实这种简化的价值很大的,代码会非常容易理解,而且容易维护。一大段充满了 IF ELSE 判断的普通 Java 代码读起来很困难,维护起来更困难。

还有一个比较大的好处时,Drools 脚本可以保存在数据库里,是随时可以编辑调整的,也就是说如果把你的业务规则都用 Drools 脚本实现,那你的业务规则是随时可在线调整的,而不会写死在普通程序代码里。
1 楼 timer_yin 2017-06-23  
感觉这个东西是不是就是把大量的IF ELSE规则判断放到了一个配置文件里,然后放进model进行判断运算后给更新model返回,还是感觉不到有啥好处

相关推荐

    drools drools drools drools drools

    drools 是一个强大的规则引擎和业务规则管理系统,用于在Java应用程序中实现复杂的业务逻辑。它基于规则推理,允许用户以声明式的方式定义规则,并在运行时执行这些规则。drools 提供了一个高效的决策自动化框架,...

    Drools

    Drools是一款强大的Java规则引擎,它为业务规则管理提供了高效、灵活且可扩展的解决方案。作为基于模型的决策自动化工具,Drools允许开发者将复杂的业务逻辑编码为一系列易于理解和维护的规则,这些规则可以独立于...

    drools7.25中文文档+drools技术指南.zip

    Drools是一款强大的业务规则管理系统(BRMS),它基于Java平台,主要用于实现复杂业务规则的管理和执行。Drools7.25是该系统的一个重要版本,提供了许多新特性和性能改进,使得开发者能够更高效地处理和执行业务规则...

    Drools6.5 部署Drools Workbench和Kie Server笔记

    在本文中,我们将深入探讨如何部署Drools Workbench和Kie Server,这两个组件是Drools6.5——一个强大的规则引擎平台的关键部分。Drools Workbench提供了一个直观的用户界面,用于创建、测试和管理业务规则,而Kie ...

    规则引擎Drools.NET移植版

    **规则引擎Drools.NET移植版** Drools是一款强大的业务规则管理系统,源自Java社区,以其灵活、高效和可扩展的特性而广受赞誉。它允许开发者将业务逻辑以规则的形式编写,使得业务规则可以独立于应用程序代码进行...

    Drools6 和 Drools7技术指南-中文文档.zip

    Drools开发最全中文版技术指南。 Drools开发最全中文版技术指南,介绍了常见的drools如何进行开发,注意是:中文版中文版中文版! drools 中文文档 规则引擎 drools6 drools7 Java

    droolsdroolsdrools

    《 Drools 深度探索:实例代码解析与实践指南》 Drools,作为一款强大的规则引擎,广泛应用于业务逻辑复杂、决策流程多变的IT系统中。它基于Java平台,采用领域特定语言(DSL)来编写业务规则,使得业务人员也能...

    5.6drools基础包

    这个"5.6drools基础包"包含了Drools的核心组件——drools-distribution-5.6.0.Final.zip和Drools的开发工具集——droolsjbpm-tools-distribution-5.6.0.Final.zip。尽管由于文件大小限制,可能缺少了一些额外的包,...

    Drools workbench文件及DEMO项目代码

    Drools工作台(Drools Workbench)是一款基于规则引擎Drools的集成开发环境,主要用于创建、测试和管理业务规则。它提供了一个图形化的用户界面,使得业务分析师和开发人员可以方便地进行规则的编写和管理。在这个...

    Drools5.3官网手册

    ### Drools 5.3 官方手册知识点总结 #### 一、Apache Camel 集成 ##### 1.1 Camel Camel 提供了一个轻量级的消息总线框架,用于将信息输入到 Drools 中并从中输出。为了简化集成过程,Drools 引入了两个关键组件...

    springboot+drools动态模板引擎

    SpringBoot和Drools的整合应用为业务规则的管理和执行提供了强大的灵活性。SpringBoot作为一个轻量级的Java开发框架,简化了Spring应用的初始化和配置,使得开发过程更加高效。而Drools则是一个强大的规则引擎,它...

    Drools实例

    Drools是一个强大的规则引擎,它允许开发者使用规则语言(如DRL)来编写业务规则,然后在运行时执行这些规则。在这个"Drools实例"中,包含的两个示例项目,GOLF和EmployTest,将帮助我们深入理解Drools的工作原理和...

    Drools规则引擎使用demo

    Drools是一款强大的规则引擎,由Red Hat公司开发并维护,它主要用于实现业务规则的管理和执行。Drools提供了一种声明式的方式来定义业务规则,使得非技术人员也能理解和修改规则,从而降低了业务逻辑与代码的耦合度...

    drools flow分析报告

    **Drools Flow 分析报告** **第一章 Drools Flow 简介** Drools Flow 是 Drools 项目的一部分,它提供了一套完整的业务流程管理(BPM)和工作流解决方案。Drools 是一个开源的规则引擎,主要用于决策管理和业务...

    Drools_规则引擎详解

    Drools 规则引擎详解 Drools 规则引擎是基于 Java 的开源规则引擎,由 JBoss 发布。作为一个业务规则管理系统(BRMS),Drools 提供了一个基于规则的系统,用于定义、执行和管理业务规则。Drools 的主要功能是将...

    drools动态生成规则文件

    drools动态生成规则文件是基于Java的业务规则管理系统,它允许开发者在运行时创建、修改和执行业务规则。 Drools是Red Hat JBoss BRMS(Business Rules Management System)的一部分,它提供了一种强大的规则引擎,...

    Drools规则执行顺序

    标题 "Drools 规则执行顺序" 涉及的是一个业务规则引擎——Drools 的核心概念。Drools 是一个开源的Java决策管理平台,它允许开发者使用规则语言来编写业务逻辑,这些规则可以按特定顺序执行,以处理复杂的业务场景...

    eclipse下的drools插件

    【标题】:Eclipse下的Drools插件 在Eclipse集成开发环境中,Drools插件是一个强大的工具,它为开发人员提供了便捷的方式来实现业务规则管理系统的开发和测试。Drools是一款开源的规则引擎,它基于Java平台,允许...

    Drools7 + Springboot2 动态更新规则

    在本文中,我们将深入探讨如何将Drools 7与Spring Boot 2集成,实现动态更新规则的功能。Drools是一款强大的业务规则管理系统,而Spring Boot是Java领域广泛使用的微服务开发框架。通过结合这两者,我们可以构建一个...

Global site tag (gtag.js) - Google Analytics