• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Drools介紹

    標簽: Java

    Drools 是用 Java 語言編寫的開放源碼規則引擎,使用 Rete 算法對所編寫的規則求值。Drools 允許使用聲明方式表達業務邏輯。可以使用非 XML 的本地語言編寫規則,從而便于學習和理解。并且,還可以將 Java 代碼直接嵌入到規則文件中,這令 Drools 的學習更加吸引人。

    Drools 還具有其他優點:

    • 非常活躍的社區支持
    • 易用
    • 快速的執行速度
    • 在 Java 開發人員中流行
    • 與 Java Rule Engine API(JSR 94)兼容

    Drools 是業務邏輯集成平臺,被分為4個項目:

    • Drools Guvnor (BRMS/BPMS):業務規則管理系統
    • Drools Expert (rule engine):規則引擎,drools的核心部分
    • Drools Flow (process/workflow):工作流引擎
    • Drools Fusion (cep/temporal reasoning):事件處理

    官網:http://www.drools.org/#
    官方文檔:http://www.drools.org/learn/documentation.html

    Drools語法

    規則文件

    規則文件可以使用 .drl文件,也可以是xml文件,這里我們使用drl文件

    規則文件

    package:對一個規則文件而言,package是必須定義的,必須放在規則文件第一行,package的名字是隨意的,不必必須對應物理路徑,跟java的package的概念不同,這里只是邏輯上的一種區分

    如:
    package com.sankuai.meituan.waimai.drools.demo
    

    import:導入規則文件需要使用到的外部規則文件或者變量,這里的使用方法跟java相同,但是不同于java的是,這里的import導入的不僅僅可以是一個類,也可以是這個類中的某一個可訪問的靜態方法

    import com.drools.demo.point.PointDomain;
    

    rule:定義一個具體規則。rule "ruleName"。一個規則可以包含三個部分:

    • 屬性部分: 定義當前規則執行的一些屬性等,比如是否可被重復執行、過期時間、生效時間等。

    • 條件部分(LHS): 定義當前規則的條件,如 when Message(); 判斷當前workingMemory中是否存在Message對象。

    • 結果部分(RHS): 即當前規則條件滿足后執行的操作,可以直接調用Fact對象的方法來操作應用。這里可以寫普通java代碼

    rule部分

    rule "ruleName"
         no-loop true
    
         when
             $message:Message(status == 0)
    
         then
             System.out.println("fit");
             $message.setStatus(1);
             update($message);
    end
    

    規則詳情

    屬性詳情

    • no-loop: 定義當前的規則是否不允許多次循環執行,默認是false;當前的規則只要滿足條件,可以無限次執行。什么情況下會出現一條規則執行過一次又被多次重復執行呢?drools提供了一些api,可以對當前傳入workingMemory中的Fact對象進行修改或者個數的增減,比如上述的update方法,就是將當前的workingMemory中的Message類型的Fact對象進行屬性更新,這種操作會觸發規則的重新匹配執行,可以理解為Fact對象更新了,所以規則需要重新匹配一遍,那么疑問是之前規則執行過并且修改過的那些Fact對象的屬性的數據會不會被重置?結果是不會,已經修改過了就不會被重置,update之后,之前的修改都會生效。當然對Fact對象數據的修改并不是一定需要調用update才可以生效,簡單的使用set方法設置就可以完成,這里類似于java的引用調用,所以何時使用update是一個需要仔細考慮的問題,一旦不慎,極有可能會造成規則的死循環。上述的no-loop true,即設置當前的規則,只執行一次,如果本身的RHS部分有update等觸發規則重新執行的操作,也不要再次執行當前規則。
      但是其他的規則會被重新執行,豈不是也會有可能造成多次重復執行,數據紊亂甚至死循環?答案是使用其他的標簽限制,也是可以控制的:lock-on-active true

    • lock-on-active:lock-on-active true 通過這個標簽,可以控制當前的規則只會被執行一次,因為一個規則的重復執行不一定是本身觸發的,也可能是其他規則觸發的,所以這個是no-loop的加強版

    • date-expires:設置規則的過期時間,默認的時間格式:“日-月-年”

    • date-effective:設置規則的生效時間,時間格式同上。

    • duration:規則定時,duration 3000,3秒后執行規則

    • salience:優先級,數值越大越先執行,這個可以控制規則的執行順序。

    **rule attributes**

    條件部分- LHS

    • when:規則條件開始。條件可以單個,也可以多個,多個條件一次排列
      如:當前規則只有在這三個條件都匹配的時候才會執行RHS部分
    when
          eval(true)
          $customer:Customer()
          $message:Message(status==0)
    
    • eval(true):是一個默認的api,true 無條件執行,類似于 while(true)

    • 操作符>>=<<===!=containsnot containsmemberOfnot memberOfmatchesnot matches

    操作符

    • contains: 對比是否包含操作,操作的被包含目標可以是一個復雜對象也可以是一個簡單的值
      Person( fullName not contains "Jr" )
    • not contains:與contains相反。
    • memberOf:判斷某個Fact屬性值是否在某個集合中,與contains不同的是他被比較的對象是一個集合,而contains被比較的對象是單個值或者對象
      CheeseCounter( cheese memberOf $matureCheeses )
    • not memberOf:與memberOf正好相反
    • matches:正則表達式匹配
      Cheese( type matches "(Buffalo)?\\S*Mozarella" )
      注意: 就像在Java中,寫為字符串的正則表達式需要轉義“\”
    • not matches:與matches正好相反

    結果部分- RHS

    當規則條件滿足,則進入規則結果部分執行,結果部分可以是純java代碼

    • then:
    then
         System.out.println("OK"); //會在控制臺打印出ok
    end
    
    • insert:往當前workingMemory中插入一個新的Fact對象,會觸發規則的再次執行,除非使用no-loop限定
    • update:更新
    • modify:修改,與update語法不同,結果都是更新操作
    • retract:刪除
    rule "Rule 03" 
          when 
              $number : Number( ) 
              not Number( intValue < $number.intValue ) 
          then 
              System.out.println("Number found with value: " + $number.intValue() ); 
              retract( $number );
    end
    

    Drools關鍵詞

    關鍵詞 描述 詳情
    lock-on-active    
    date-effective    
    date-expires    
    no-loop    
    auto-focus    
    activation-group    
    agenda-group    
    ruleflow-group    
    entry-point    
    duration    
    package    
    import    
    dialect    
    salience    
    enabled    
    attributes    
    rule    
    extend    
    when    
    then    
    template    
    query    
    declare    
    function    
    global    
    eval    
    not    
    in    
    or    
    and    
    exists    
    forall    
    accumulate    
    collect    
    from    
    action    
    reverse    
    result    
    end    
    over    
    init   -

    Drools方法定義

    • function
    function String hello(String name) { 
          return "Hello "+name+"!";
    }
    

    Drools聲明類型

    • declare:聲明類型
    • 聲明Class、Enum etc類型
    • 聲明元數據

    聲明類類型

    declare  Address 
        number : int 
        streetName : String 
        city : String
    end
    

    聲明枚舉類型

    declare enum DaysOfWeek
        SUN("Sunday"),MON("Monday"),TUE("Tuesday"),WED("Wednesday"),THU("Thursday"),FRI("Friday"),SAT("Saturday"); 
        fullName : String
    end
    

    聲明元數據類型

    元數據可以被分配給在Drools中幾個不同的結構:

    • fact types
    • fact attributes
    • rules
    定義格式:
    @metadata_key(metadata_value)
    
    例子:
    @author( Bob )
    
    import java.util.Date
        declare Person 
        @author( Bob ) 
        @dateOfCreation*( 01-Feb-2009 ) 
        name : String @key @maxLength*( 30 ) 
        dateOfBirth : Date address : Address
    end
    

    聲明元數據類級別 關鍵詞

    • @role( <fact | event> )
    import some.package.StockTick
    declare StockTick 
        @role ( event )
    end
    
    • @typesafe( <boolean> )
    • @timestamp( <attribute name> )
    declare VoiceCall 
        @role( event ) 
        @timestamp( callDateTime )
    end
    
    • @duration( <attribute name> )

    • @expires( <time interval> )

    • @propertyChangeSupport

    • @propertyReactive

    聲明元數據屬性級別 關鍵詞

    • @key

    兩個方面影響:

    • 根據@key作為類標識符,類比較以 @key 的字段為準
    • 根據@key字段生成構造函數
    declare Person 
        firstName : String @key 
        lastName : String @key 
        age : int
    end
    
    • @position
    declare Cheese 
        name : String @position(1) 
        shop : String @position(2) 
        price : int @position(0)
    end
    

    設計

    Drools vs ILog vs Jess vs Mandarax

      優點  
    Drools 開源、社區非常活躍、易使用、免費、JSR94兼容(JSR94是Java Rule Engine API)、支持Java、強大的工具集 只支持一種推理方式、安全性不夠
    ILog 性能高(電信領域使用)、易使用 商業產品、不開源
    Jess 支持2種推理方式(正向鏈和反向鏈)、很強的表示、推理能力、支持AOP 不開源、無規則管理工具、不易使用
    Mandarax 開源、免費、支持Java JSR94不兼容(JSR94是Java Rule Engine API)、已經不更新、社區不活躍、并且文檔不全

    推理方式

    • 正向鏈推理:一條由問題開始搜索,并得到其解答的鏈稱為正向鏈推理。
    • 反向鏈推理:一條由假設回推到支持該假設的事實的鏈稱為反向鏈推理。
    版權聲明:本文為tianshan2010原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/tianshan2010/article/details/104025893

    智能推薦

    【轉載】Drools學習

    Drools使用總結 學習自: https://blog.csdn.net/column/details/16183.html?&page=1 什么是Drools Drools是Java編寫的一款開源規則引擎,實現了Rete算法對所編寫的規則求值,支持聲明方式表達業務邏輯。使用DSL(Domain Specific Language)語言來編寫業務規則,使得規則通俗易懂,便于學習理解。支持...

    spark drools集成開發

         flink 有cep復雜事件處理庫,spark中沒有cep處理庫,如何在spark中實現cep復雜事件處理? 業界普遍使用開源的drools規則引擎集成去處理,cloudera官方博客就有spark 集成drools實現cep處理能力。 項目結構: pom 文件依賴配置: 代碼: 執行測試: spark drools集成測試6.5版本本地,集群模式都可以正常...

    Drools入門系列

    轉載自:Drools Drools(JBoss Rules )具有一個易于訪問企業策略、易于調整以及易于管理的開源業務規則引擎,符合業內標準,速度快、效率高。業務分析師或審核人員可以利用它輕松查看業務規則,從而檢驗是否已編碼的規則執行了所需的業務規則。Drools是為Java量身定制的基于Charles Forgy的RETE算法的規則引擎的實現。具有了OO接口的RETE,使得商業規則有了更自然的表...

    規則引擎-Drools

    Drools規則引擎 KIE KIE是一個分組的名字,囊括了多個工程。可以用于多個工程同一構建,部署和運用。 Drools是一個業務規則管理系統,具有前向鏈接和后向鏈接的基于推理的規則引擎,允許快速可靠地評估業務規則和復雜的事件處理。規則引擎也是創建專家系統的基本構件,在人工智能中,專家系統是模擬人類專家決策能力的計算機系統。 OptaPlanner是一個本地搜索和優化工具,它是從Drools P...

    規則引擎——Drools

    Drools簡介 Drools使用范例 語法介紹 名詞解釋 Drools簡介   JBoss Rules 的前身是Codehaus的一個開源項目叫Drools。最近被納入JBoss門下,更名為JBoss Rules,成為了JBoss應用服務器的規則引擎。   Drools是為Java量身定制的基于Charles Forgy的RETE算法的規則引擎的實現。具有...

    猜你喜歡

    drools 規則引擎

    @woshiqiuxiaoyan 源碼git 創建規則客戶端,編寫使用規則 在服務端編寫drl文件 轉自:https://blog.csdn.net/woshiqiuxiaoyan...

    3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習

    3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 自學資源 作業內容 1、基本操作演練【建議做】 天空盒的制作: 地圖的制作: 整體效果: 2、編程實踐 項目要求: 項目結構: 代碼詳解: Actions: ISSActionCallback.cs SSAction.cs SSAction...

    FlycoTabLayout 的使用

    FlycoTabLayout 一個Android TabLayout庫,目前有3個TabLayout SlidingTabLayout:參照PagerSlidingTabStrip進行大量修改. 新增部分屬性 新增支持多種Indicator顯示器 新增支持未讀消息顯示 新增方法for懶癌患者 CommonTabLayout:不同于SlidingTabLayout對ViewPager依賴,它是一個不...

    爬蟲項目實戰八:爬取天氣情況

    爬取天氣情況 目標 項目準備 接口分析 代碼實現 效果顯示 寫入本地 目標 根據天氣接口,爬取接下來一周的天氣情況。 項目準備 軟件:Pycharm 第三方庫:requests,BeautifulSoup,csv 接口地址:http://api.k780.com:88/?app=weather.future&weaid=城市名&appkey=10003&sign=b59bc...

    關于web項目的目錄問題

    先給段代碼: 上面這個代碼一直出錯,我不知道原因,后面不停的查找資料發現了問題:我的web項目輸出目錄有問題,因為我也是第一次用idea寫web項目,發現很多bug 其實都沒有太大問題,我們需要注意的是你必須在out這個輸出文件夾中擁有這個文件,out輸出文件夾會默認過濾這些文件...

    精品国产乱码久久久久久蜜桃不卡