久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Drools掃盲普及貼

 埃德溫會館 2015-03-01
一花一世界,一葉一菩提



一 前言

     最早對Drools感興趣,是起源于規(guī)則引擎.當(dāng)時是希望能找一個開源工具來做一些規(guī)則的處理.

     在官方網(wǎng)站上翻了半天資料,卻發(fā)現(xiàn)Drools一直在強調(diào)它不只是一個簡單的規(guī)則引擎,而是更多的引入工作流的概念.
     之后最大的感觸就是Drools牽涉到的東西比較多,甚至有一種依照Drools可以創(chuàng)造整個世界的感覺-- 這個世界本身不就是由各種規(guī)則/流程/事件構(gòu)成的么? 這也是本文標(biāo)題的由來.

     以后會對Drools的各方面有一個比較深入的了解,因此這篇文章只是用來做簡單的介紹,希望能在短時間內(nèi)能讓其他人對Drools做什么,怎么做,有一個直觀的了解,以后遇到相關(guān)應(yīng)用的場景時,能想到Drools的解決方案.

    PS:PPT是在Team內(nèi)部的團隊分享時使用的,有一些鏈接可能會失效(外網(wǎng)無法訪問).本文內(nèi)容和PPT不會完全一致.不過問題不大了.



二.從規(guī)則引擎的應(yīng)用場景說起

     昨天講解PPT的時候有人問到Drools和If-else的本質(zhì)區(qū)別在哪里.我想了想,還是想引用一句話來表述自己的感受.
          "南京一高職學(xué)生為了給男友發(fā)鯨魚寶寶的短信涉嫌偽造健康證明捐精買iphone4,。,。,。。"

    
2.1 各種棋類游戲

     象棋圍棋五子棋跳棋軍棋撲克牌三國殺殺人游戲強權(quán)外交等等等等.游戲本身就是規(guī)則的代名詞.

2.2 業(yè)務(wù)規(guī)則
     超市打折,匯率計算等等等等.
 
2.3 相通的場景

     這些場景可能有一些相通的點,在這兒我可能總結(jié)的不會太全面,稍稍羅列一下:
  
   
  •      單條規(guī)則相對簡單
  •      規(guī)則數(shù)量相對龐大
  •      規(guī)則之間會有沖突
  •      一條規(guī)則本身會觸發(fā)另一條規(guī)則
  •      規(guī)則有可能會產(chǎn)生變動(很多時候可能唯一需要變動的就是規(guī)則)

   
    這個時候用規(guī)則引擎來處理這些事情就相對來說容易多了.不過,Drools做的遠(yuǎn)遠(yuǎn)不止這些.


   
三 Drools的構(gòu)成.   

    目前Drools的最新穩(wěn)定版本是5.2.0.Final(23-Jun-2011). 現(xiàn)在由JBoss維護,分成五個模塊.

     下面就簡單的介紹下每一個模塊的內(nèi)容,可以大致的了解下Drools的發(fā)展方向和可以用來解決問題的范疇.   

3.1 Guvnor    

     Guvnor是一個通過Web界面可以管理,更改規(guī)則的工具,也可以提供Repository的服務(wù).(似乎各種開源軟件里都會提供這樣的Web管理界面,Heritrix,Nutch,AllGeography等等等等).支持Dsl和QA. 
    
3.2 Expert         

     傳統(tǒng)的規(guī)則引擎,應(yīng)該說Drools的核心,也是前身.通過Rete算法來實現(xiàn)模式匹配.
    
3.3 Jbpm5

     工作流的處理交給了JBPM5這個模塊.這個模塊我了解的不多,大概知道的是除了工作流之外還提供了各種各樣的集成(Camel,Spring,Osgi等等,感覺這個模塊本身的規(guī)劃不是特別清晰).其中Camel適用于路由轉(zhuǎn)發(fā).有了解的較多的朋友可以指教一下,或者以后有時間我會再了解一下相關(guān)的內(nèi)容.     
     
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
(話說這些問題有什么共同點我還沒有領(lǐng)會得到,大體的感覺是可以用來解決一些規(guī)劃問題,或者是說求解問題).

  

3.6 關(guān)系圖    

    這是我理解的關(guān)系圖.
    
     
    
    Expert還是核心,Fusion和Planer和Workflow都應(yīng)該是規(guī)則的應(yīng)用到具體領(lǐng)域的擴展,通過JBPM5還提供了和各種開源軟件的集成.Guvnor來提供各種資源的管理.


  




四 Expert  

   對Expert有了解就可以使用Drools了.所以我想還是總體的介紹下Expert的使用,這樣具體的細(xì)節(jié)其他朋友可以通過翻閱手冊來自己解決了.

    列出幾個知識點:

    1.Drl文件.
          Drl就是Drools用來描述規(guī)則的文件.DRL文件的結(jié)構(gòu)包括以下幾部分:
引用

package package-name
imports
globals
functions
queries
rules
    
     

       Drl中可以通過Import的方式引入Model類,也可以調(diào)用Java的各種函數(shù).
       Drl中也可以自己定義Class和Function.
       Queries的應(yīng)用場景還不太了解,目前沒有用到過.


       Rules就是規(guī)則的部分,它的結(jié)構(gòu)如下:

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


      
      每一條規(guī)則都有名稱.
      每一條規(guī)則都有屬性(lock-on-active等)
      When里寫的是LHS(Left Hand Side,左手邊),等同于IF里的條件判斷.左手邊是Drools自己的語法規(guī)則,詳見Drools的文檔.
      Then里寫的是RHS(Right Hand Side,右手邊),等同于IF里的執(zhí)行語句.右手邊支持多種語言(Java,Pthyon,Groovy等).

  2.規(guī)則文件的使用
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.區(qū)別是StateFul是可以完成推理的,即一條規(guī)則有可能導(dǎo)致另一條規(guī)則的觸發(fā),因此需要顯示的調(diào)用一下FireAllRules().而StateLess是不支持規(guī)則推理的.所以規(guī)則是自動觸發(fā).




Employee 是一個簡單的Demo類,用來表示一個員工.這里想給出的是一個判斷員工上班是否遲到的示例,因此Employee可以設(shè)計成這個樣子.

  
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.        



假設(shè)公司的遲到規(guī)則是九點鐘以后打卡就算遲到,那么規(guī)則就可以寫成這樣子.

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進(jìn)去,調(diào)用FireAllRules方法,就是執(zhí)行了規(guī)則,Model的值就會發(fā)生改變.
  這就是Expert使用的最簡單的方式.


  3.產(chǎn)生式系統(tǒng)
     規(guī)則引擎里的一些術(shù)語是來自于產(chǎn)生式系統(tǒng)的.如LHS,RHS,Fact,ProductMemory,WorkingMemory.
     LHS和RHS之前已經(jīng)提到過,下面來介紹一下其它的術(shù)語.
     Fact:每一條規(guī)則稱之為Fact.
     ProductMemory:保存Fact.如上例說到的遲到的規(guī)則.
     WorkingMemory:保存每一個實例,如上例說到的每一個員工.

   
    可以把規(guī)則引擎理成一個WorkingMemeory和ProductMemory的模式匹配.有四種算法.(Linear,Rete,Treat,Leap).
    Drools使用的是Rete.據(jù)說也有Leap的實現(xiàn),后來因為無人使用也無人維護給放棄了.
   

   
  4.Rete    

      Rete是網(wǎng)絡(luò)的意思,簡單的說,Rete算法的思路就是事先將Fact構(gòu)建成一個過濾網(wǎng),這個過濾網(wǎng)由四種節(jié)點構(gòu)成.分別是Root,1-input(alpha),2-input(beta),terminal.

      這四個節(jié)點也比較簡單,Root是入口,所有的實例都從Root出進(jìn)入Rete.Alpha用來做Literal的驗證(如"Name=段三品"),Beta節(jié)點用來做對象的驗證,如(employee1=employee2),terminal是終止節(jié)點.
  
     一直在想一個簡單的方式能描述Rete做的功能.可以想象成從Root到Aplpha到Beta到Terminal是由不同的閥門構(gòu)成的水管.
    
    從Root處開始往下倒各種液體(水,酒,醋等等,等同于WorkingMemory的一個個實例),對于各個節(jié)點來說,如果滿足自己的驗證條件,那么就可以放行.如果不滿足,就不通過.這樣最后從Terminal流出的就是匹配到的規(guī)則.

    昨天又有人問到這個和有限狀態(tài)自動機的區(qū)別是什么.我想?yún)^(qū)別就在于每一個節(jié)點都保留了符合這個節(jié)點的WorkingMemory.而有限狀態(tài)自動機是不會保存這些內(nèi)容的.

   以上是對Rete的簡單理解,希望能有朋友多指教.
   符上一張圖(很遺憾忘記在哪兒粘過來的了,對原圖的作者表示歉意).
      


五 Guvnor  

   Guvnor這部分,我想說的主要是關(guān)于Dsl的部分.
   Dsl其實大部分人已經(jīng)經(jīng)常用到了.只不過自己還不知道而已.如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.      



   這樣在編輯規(guī)則的時候.就可以用Dsl語言去編寫規(guī)則了.有助于將業(yè)務(wù)邏輯從代碼中分離出去.將變化和非變化的部分分離開來.


六. 小結(jié) 

    Drools對于規(guī)則的理解更深入,或者說是對于規(guī)則的應(yīng)用理解更深入.當(dāng)然這個世界是由什么來構(gòu)成的,不可能有一個準(zhǔn)確又有用的答案.可是至少在Drools的眼里,世界可以由規(guī)則組成.

    有太多的內(nèi)容沒有涉及到了,所以還是希望這篇文章能夠做到之前對Drools給出一個感性的認(rèn)識,知道Drools能做什么事情,了解Drools怎么去做的.以后再面對項目需求時,在可以用到Drools的場景下,再去詳細(xì)查證手冊好了.

    另外Drools的安裝包本身包含大量的示例程序.Reference做的也相當(dāng)不錯.都是很好的資料.

    
   
  
      
   
  
    
          
   

   









       
    

   



  

  

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多