1. 程式人生 > 程式設計 >Drools-規則引擎簡單介紹

Drools-規則引擎簡單介紹

Drools-在我同學沒有跟我說的時候,我都沒有聽過這個東西,都不知道它是做什麼的,於是深夜補充乾糧....

Drools介紹

Drools簡單來說就是規則,他為了規則而生。有些複雜多變的業務場景,僅僅靠我們日常的判斷處理是不夠的,規則是變化很快的,隨著不可控因素(天氣,日期,活動等等),規則也是隨之變化,而專案是不可能隨之而變更上線的。

而Drools中是符合當前的業務場景變化的規則引擎之一。一旦資料滿足條件匹配,則會執行對應的邏輯處理:

when 滿足什麼樣的條件
then 最終的結果
複製程式碼

為什麼需要規則介入

在一些簡單並且業務量不復雜的系統中,僅僅只需要條件語句判斷一下就好了,沒必要引入規則引擎。但是針對於一個龐大的業務場景以及可能每天每個時間點都會有不同規則介入的專案來說,這個是不滿足當前的情況的。只會讓開發人員以及產品人員頭痛。

業務規則往往遵循以下的原則:

  • 它們是獨立的
  • 它們很容易更新
  • 每個規則控制所需的最小資訊量
  • 它們允許不同背景的人進行合作

Drl執行流程

Drools規則引擎將業務規則轉換成執行樹:

每個規則條件分為小塊,在樹結構中連線和重用。每次將資料新增到規則引擎中時,它將在與此類似的樹中進行求值,併到達一個動作節點,在該節點處,它們將被標記為準備執行特定規則的資料。

簡單Demo介紹

我這邊本地簡單的實現了一個小的Demo,裡面就是對於當前的規則引擎的一個簡單的使用介紹情況。

當前專案目錄層次

├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── montos
│   │   │           ├── DroolsStartApplication.java
│   │   │           ├── controller
│   │   │           │   └── TestController.java
│   │   │           ├── entity
│   │   │           │   └── Message.java
│   │   │           ├── impl
│   │   │           │   └── DroolsServiceImpl.java
│   │   │           └── service
│   │   │               └── DroolsService.java
│   │   └── resources
│   │       ├── META-INF
│   │       │   └── kmodule.xml
│   │       └── rules
│   │           └── Helloworld.drl
│   └── test
│   └── java └── target ├── classes │   ├── META-INF │   │   └── kmodule.xml │   ├── com │   │   └── montos │   │   ├── DroolsStartApplication.class │   │   ├── controller │   │   │   └── TestController.class │   │   ├── entity │   │   │   └── Message.class │   │   ├── impl │   │   │   └── DroolsServiceImpl.class │   │   └── service │   │   └── DroolsService.class │   └── rules │   └── Helloworld.drl └── generated-sources └── annotations 複製程式碼

pom.xml依賴

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-decisiontables</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-templates</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
複製程式碼

serviceImpl類

public class DroolsServiceImpl implements DroolsService {

    @Override
    public String fireRule() {
        KieServices ks = KieServices.Factory.get();
        KieContainer kContainer = ks.getKieClasspathContainer();
        KieSession kSession = kContainer.newKieSession("ksession-rules");

        Message message = new Message();
        message.setMessage("Good Bye");
        message.setStatus(Message.GOODBYE);
        kSession.insert(message);//插入
        kSession.fireAllRules();//執行規則
        kSession.dispose();
        return message.getMessage();

    }
}
複製程式碼

kmodule.xml

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="rules" packages="rules">
        <ksession name="ksession-rules"/>
    </kbase>
</kmodule>
複製程式碼

Helloworld.drl

package com.montos.drools.test1 #虛擬包名,不一定需要與物理存在的包名一致
import com.montos.entity.Message
dialect  "mvel" # 方言  預設是java

rule "Hello World" # 規則名
    dialect "mvel"
    when
        m : Message(status.equals(Message.HELLO),message : message )#條件
    then
        System.out.println( message);#動作
    modify ( m ) { message = "Goodbye cruel world",status = Message.GOODBYE }; //更新語句,會導致引擎重新檢查所有規則是否匹配條件,而不管其之前是否執行過
end

rule "Good Bye"
    dialect "java"
    when
       Message( status == Message.GOODBYE,message : message )
    then
        System.out.println( message );
end
複製程式碼

上面的就簡單的介紹了部分重要的程式碼,裡面如果執行的話,主要看service的實現類裡面的邏輯,獲取配置的規則策略,然後根據drl檔案中的規則策略進行跑結果。

上面對於當前的Drools簡單介紹,關於這方面的資料網上大多數都是對於簡單的Api介紹以及類似當前的介紹,對於複雜的業務場景的Demo是沒有的。有資料的小夥伴可以留言分享下給我,不勝感激。

文章中部分資料轉載自:blog.csdn.net/chinrui/art…