1. 程式人生 > >一文入門Drools規則引擎

一文入門Drools規則引擎

Drools是一款基於Java的優秀的規則引擎,將複雜多變的業務規則從硬編碼中解放出來,以規則指令碼的形式存放在檔案中,使得修改規則不需要改動程式碼重啟服務就能生效。
Drools有一定的學習成本,官方英文文件非常詳細,但中文文件少,本文將通過一篇文章來介紹Drools的使用和動態部署,這也是我學習過後的總結,希望對你入門Drools有幫助。

官網地址:https://www.drools.org/
github: https://github.com/kiegroup/drools

簡單使用

一個給不同商品設定不同折扣的例子
pom.xml

<dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-compiler</artifactId>
      <version>7.23.0.Final</version>
</dependency>

kmodule.xml 檔案用於配置規則指令碼,可以有多個kbase
檔案放在專案resources/META-INF目錄下可以自動載入

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
    <kbase name="rules" packages="rules">
        <ksession name="ksession-rule"/>
    </kbase>
</kmodule>

Product Bean實體

//lombok註解
@Data
public class Product {
    public static final String DIAMOND = "DIAMOND";

    public static final String GOLD = "GOLD";

    private String type;

    private int discount;
}

resources/rules/Rules.drl 規則指令碼

package rules

import drools.Product

//當商品型別是DIAMOND時,打折為15%
rule Offer4Diamond
    when
        productObject:Product(type == Product.DIAMOND)
    then
        productObject.setDiscount(15);
    end

//當商品型別是GOLD時,打折為25%
rule Offer4Gold
    when
        productObject: Product(type == Product.GOLD)
    then
        productObject.setDiscount(25);
    end

junit Test

    @Test
    public void droolsTest() {
        KieServices ks = KieServices.Factory.get();
        KieContainer kieContainer = ks.getKieClasspathContainer();
        KieSession kSession = kieContainer.newKieSession("ksession-rule");

        Product product = new Product();
        product.setType(Product.GOLD);

        kSession.insert(product);
        int count = kSession.fireAllRules();
        System.out.println("命中了" + count + "條規則");
        System.out.println("商品" + product.getType() + "的商品折扣為" + product.getDiscount() + "%");
    }

執行結果

命中了1條規則
商品GOLD的商品折扣為25%

解釋一下

kmodule.xml

  • 該檔案用來配置規則表,可以包含多個kbase,每個kbase都有name屬性,不能重複

  • kbase可以包含多個ksession, packages屬性是src/main/resources目錄下資料夾的包路徑,可以定義多個包,逗號分隔,packages目錄下的所有規則檔案都會被載入,除了子目錄

  • ksession 的name不能重複,Java程式碼中KieSession設定的name就是該配置的name

droolsTest

  • KieServices 
    該介面提供了很多方法,可以通過這些方法訪問KIE關於構建和執行的相關物件,比如說可以獲取KieContainer,利用KieContainer來訪問KBase和KSession等資訊;可以獲取KieRepository物件,利用KieRepository來管理KieModule等。 
    KieServices就是一箇中心,通過它來獲取的各種物件來完成規則構建、管理和執行等操作。

  • KieContainer
    KieContainer可以理解為是一個KieBase的容器。

  • KieBase 
    KieBase可以理解為是一個知識倉庫,包含了若干的規則、流程、方法等,在Drools中主要就是規則和方法,KieBase本身並不包含執行時的資料之類的,如果需要執行規則KieBase中的規則的話,就需要根據KieBase建立KieSession。

  • KieSession
    KieSession就是一個跟Drools引擎打交道的會話,其基於KieBase建立,它會包含執行時資料,包含“事實 Fact”,並對執行時資料事實進行規則運算。我們通過KieContainer建立KieSession是一種較為方便的做法,其實他本質上是從KieBase中創建出來

動態規則

實現動態規則有這幾種思路

     1. 使用Workbench,通過Web管理頁面動態生成配置規則

     2. 將規則以字串的形式存入資料庫,需要自己開發一套規則管理系統

使用Wrokbench

1.docker部署workbench

workbench
docker run -p 8080:8080 -p 8001:8001 -d --name drools-wb jboss/drools-workbench-showcase:7.5.0.Final 
kie-server
docker run -p 8180:8180 -d --name kie-server --link drools-wb:kie_wb jboss/kie-server-showcase:7.5.0.Final

訪問http://ip地址:8080/drools-wb 
預設賬號/密碼 admin/admin

2.建立專案

 

3.建立Object

 

4.建立DRL檔案

 

5.部署

6.使用部署的規則檔案

遠端規則Maven倉庫地址獲取

 


本地Maven倉庫settings.xml配置,這裡只摘錄了需要新增的3處,需要對應去新增

<server>
      <username>admin</username>
      <password>admin</password>
      <id>guvnor-m2-repo</id>
</server>

<profile>
  <id>guvnor-m2-repo</id> 
  <repositories>
    <repository>
      <id>guvnor-m2-repo</id>
      <name>Guvnor M2 Repo</name> 
      <url>http://10.211.55.7:8080/drools-wb/maven2/</url>
      <layout>default</layout> 
      <releases>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy> 
      </releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy> <!--更新策略,常常 --> 
      </snapshots>
    </repository> 
  </repositories>
  <activation> 
    <activeByDefault>true</activeByDefault>
  </activation>
</profile>

<activeProfiles>
    <activeProfile>guvnor-m2-repo</activeProfile>
</activeProfiles>

建立一個標準的SpringBoot工程

Product實體,包路徑要跟規則檔案中的一致

@Data
public class Product {
    private String type;

    private int discount;
}

DroolsController.java

@RestController
@RequestMapping("/api/")
@Slf4j
public class DroolsController {

    @PostMapping("getdiscount")
    public Product getDiscount(Product product) throws IOException {
        KieServices ks = KieServices.Factory.get();
        //RELEASE 代表使用jar包的最新正式版
        ReleaseIdImpl releaseId = new ReleaseIdImpl("com.myteam", "test", "RELEASE");
        KieContainer kieContainer = ks.newKieContainer(releaseId);
        //自動掃描Maven倉庫,有新版本會自動下載
        KieScanner kieScanner = ks.newKieScanner(kieContainer);
        kieScanner.start(3000);
        KieSession kieSession = kieContainer.newKieSession();
        kieSession.insert(product);
        int count = kieSession.fireAllRules();

        log.info("共執行了{}條規則", count);
        log.info("商品{}的折扣為{}%", product.getType(), 
        product.getDiscount());
        return product;
    }
}

PostMan訪問介面


與DRL規則檔案中配置的一致

7.動態規則

修改ppdrl.drl規則表,修改GOLD的打折為50%,儲存規則,將專案版本提高一個版本,並build&deploy專案

 

 


再次訪問介面,GOLD的折扣已經變為50%,其中沒有重啟服務

 

相關推薦

入門Drools規則引擎

Drools是一款基於Java的優秀的規則引擎,將複雜多變的業務規則從硬編碼中解放出來,以規則指令碼的形式存放在檔案中,使得

Drools規則引擎入門指南(

表達 sts lsa http 資源文件 用戶 批量 -c 對象 最近項目需要增加風控系統,在經過一番調研以後決定使用Drools規則引擎。因為項目是基於SpringCloud的架構,所以此次學習使用了SpringBoot2.0版本結合Drools7.14.0.Final

Drools規則引擎入門指南(二)

本篇部落格主要講解Drools常用的屬性以及函式 屬性 首先我們在resources\rules資料夾下建立一個Property.drl,還有一個DroolsApplicationPropertyTests 1. salience優先順序 salience 屬性的值預設為0,它的值越大執行的

Drools規則引擎入門指南(三)——使用Docker部署Workbench

其實本來我也是打算使用Tomcat來部署Workbench的,但是在網上看了幾篇文章,超級繁瑣的配置、各種版本。實在看不下去了索性就直接使用Docker來部署了。本次部署的版本是最新穩定版,對應drools的7.14.0.Final版本。 1. 拉取映象 1

Drools 規則引擎----向領域驅動進步(

PS:文章還在寫,目前都是一些概念性質的,想要做拓展的程式猿請過幾天再看,Drools會一致做完的~~~ 1. 工欲善其事,必先利其器 Drools提供基於eclipse的IDE(這是可選的),但其核心只需要Java 1.5(Java SE)。

Spring Boot+Drools規則引擎整合

ood pid message star 定義 比較 java sch 4.0 目的 官方的Drools範例大都是基於純Java項目或Maven項目,而基於Spring Boot項目的很少。 本文介紹如何在Spring Boot項目上加上Drools規則引擎。 POM

drools規則引擎中易混淆語法分析_循環觸發導致死循環分析

int calculate efault drools put 階段 ons not quest 整理了下最近在項目中使用drools出現的問題,幸好都在開發與測試階段解決了,未波及到prod。 首先看這樣兩條規則 /** * 規則1_set默認利率 */

spring+maven整合Drools規則引擎詳解

       最近在弄規則引擎,在網上也找了很多,沒有一篇文章是完整的,基本上你能發現好多都是一個模子刻出來的,在這裡我把我整合的步驟給大家貼出來,供大家參考。        我這邊用的開發工具是Eclpise4

Drools 規則引擎

  轉 https://blog.csdn.net/qq_31179577/article/details/76585854 PS:文章還在寫,目前都是一些概念性質的,想要做拓展的程式猿請過幾天再看,Drools會一致做完的~~~ 1. 工欲善其事,必先利其器 Drools

drools-規則引擎語法

  轉  https://www.jianshu.com/p/6ca9dd36f7aa Drools語法-Language 關鍵詞 Pakage package package表示一個名稱空間.package是必須定義的,必須放在規則檔案第一行.

通過入門Matplotlib

1、開始 import matplotlib.pyplot as plt import numpy as np x = np.linspace(-1,1,50)#從(-1,1)均勻取50個點 y = 2 * x plt.plot(x,y) plt.show() 2、Figure物件

入門NodeJS

  NodeJS¶ 1.環境配置¶ 之前講ES6的時候有提過一部分Node的知識,簡單回顧下:一文讀懂ES6 1.1.NPM國內映象¶ npm國內映象:https://npm.taobao.org 配置國內源:npm in

Drools 規則引擎環境搭建

一、關於 drools 規則引擎 前面寫過一篇 Drools 規則引擎相關的文章,這篇文章主要記錄一下規則引擎的環境搭建和簡單示例。不熟悉 drools 的朋友可以看看這篇文章: 自己寫個 Drools 檔案語法檢查工具——棧的應用之編譯器檢測語法錯誤 介紹的內容: Drools 規則引擎的使用場景

轉:入門Makefile

1. 什麼是Makefile 一個企業級專案,通常會有很多原始檔,有時也會按功能、型別、模組分門別類的放在不同的目錄中,有時候也會在一個目錄裡存放了多個程式的原始碼。 這時,如何對這些程式碼的編譯就成了個問題。Makefle就是為這個問題而生的,它定義了一套規則

CEP之於Drools規則引擎

什麼是CEP CEP(Complex Event Processing)是複雜事件處理系統; 可以將一個或多個的事實對映到一個或多個規則上; 接受大量的資料輸入,解釋業務規則,並根據業務規則做出

Drools 規則引擎----向領域驅動進步(四)

1.複雜事件處理 到目前為止,我們已經看到如何使用規則,以基於資料(我們稱呼它為fact)來做出決定。這個資訊幾乎是任何一組Java物件,它們描述了我們正在做決策的域的狀態,但是它總是在一個特定的時間點上代表這個世界的狀態。本章我們將會去看一些列的概念,配置和

規則引擎二:Drools規則引擎

原文連結:http://www.it165.net/pro/html/201503/36286.html Drools是一個開源的規則引擎,經過多年的發展,也提供如下商業BRMS具備的功能元件: 基於Eclipse的整合開發環境, 獨立集中的規則儲存庫 基於WE

Drools 規則引擎視訊教程》相關事宜

非常感謝大家能夠有時間來看這篇部落格,本篇部落格主要介紹一下最近本人正在致力於的Drools 7 規則引擎文件和視訊教程相關事項。 Drools 本身在國內的技術網站上的資料就比較少,最近的視訊教程更是幾乎沒有。本人最近一段時間正在致力於文件編寫(已經完成過半

入門BP神經網路——從原理到應用(應用篇)

編號 公式 備註 1 Z[l]=w[l]A[l−1]+b[l] 2 A[l]=σ(Z[l]) 3 dZ[L]=∇AC⊙σ′(Z[L]) 4 dZ[l]=[w[l+1]

JAVA中Drools規則引擎

在系統建設階段,有些功能是通過drools規則引擎來實現的,通過規則引擎,我們可以實現很多可以動態變更及函式過濾的功能,但是我們在處理字串處理的時候,不可避免的會遇到特殊字元的處理,所以我們針對特殊字元需要進行該轉義的轉義。主要的幾個字元如下:switch (sign)