天天看點

規則引擎 Drools:WorkBench動态規則

WorkBench簡介

WorkBench是KIE元件中的元素,也稱為KIE-WB,是Drools-WB與JBPM-WB的結合體。它是一個可視化的規則編輯器。WorkBench其實就是一個war包,安裝到tomcat中就可以運作。使用WorkBench可以在浏覽器中建立資料對象、建立規則檔案、建立測試場景并将規則部署到maven倉庫供其他應用使用。

下載下傳位址:https://download.jboss.org/drools/release/7.10.0.Final/kie-drools-wb-7.10.0.Final-tomcat8.war

注意:下載下傳的war包需要安裝到tomcat8中。

WorkBench安裝

安裝步驟:

第一步:配置Tomcat的環境變量TOMCAT_HOME,對應的值為Tomcat安裝目錄

第二步:在Tomcat的bin目錄下建立setenv.bat檔案,内容如下:

第三步:将下載下傳的WorkBench的war包改名為kie-drools-wb.war并複制到Tomcat的webapps目錄下

第四步:修改Tomcat下conf/tomcat-users.xml檔案

<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">
	<!--定義admin角色-->
  <role rolename="admin"/>
  <!--定義一個使用者,使用者名為kie,密碼為kie,對應的角色為admin角色-->
  <user username="kie" password="kie" roles="admin"/>
</tomcat-users>
           
第五步:下載下傳以下三個jar包并複制到Tomcat的lib目錄下
kie-tomcat-integration-7.10.0.Final.jar
javax.security.jacc-api-1.5.jar
slf4j-api-1.7.25.jar
           

第六步:修改Tomcat的conf/server.xml檔案,添加Valve标簽,内容為:

第七步:啟動Tomcat并通路http://localhost:8080/kie-drools-wb,可以看到WorkBench的登入頁面。使用前面在tomcat-users.xml檔案中定義的使用者進行登入即可

規則引擎 Drools:WorkBench動态規則
登入成功後進入系統首頁:
規則引擎 Drools:WorkBench動态規則

WorkBench使用

建立空間、項目

WorkBench中存在空間和項目的概念。在使用WorkBench時首先需要建立空間(Space),在空間中建立項目,在項目中建立資料對象、規則檔案等。

建立空間

第一步:登入WorkBench後進行系統首頁,點選首頁中的Design區域進入項目清單頁面:

規則引擎 Drools:WorkBench動态規則

如果是第一次登入還沒有建立項目則無法看到項目

第二步:點選左上角Spaces導航連結進入空間清單頁面

規則引擎 Drools:WorkBench動态規則
第三步:點選右上角Add Space按鈕彈出建立添加空間視窗
規則引擎 Drools:WorkBench動态規則
錄入空間名稱,點選Save按鈕則完成空間的建立,如下圖:
規則引擎 Drools:WorkBench動态規則

前面已經提到,在WorkBench中需要先建立空間,在空間中才能建立項目。上面已經建立了一個空間javakf,現在需要住此空間中建立項目。

建立項目

第一步:點選javakf空間,進入此空間

規則引擎 Drools:WorkBench動态規則

可以看到目前空間中還沒有項目

第二步:點選Add Project按鈕彈出添加項目視窗

規則引擎 Drools:WorkBench動态規則
第三步:在添加項目視窗中錄入項目名稱(例如項目名稱為test),點選Add按鈕完成操作
規則引擎 Drools:WorkBench動态規則
可以看到在完成項目建立後,系統直接跳轉到了項目頁面。要檢視目前javakf空間中的所有項目,可以點選左上角javakf連結:
規則引擎 Drools:WorkBench動态規則

建立資料對象

資料對象其實就是JavaBean,一般都是在drl規則檔案中使用進行規則比對。

第一步:在javakf空間中點選test項目,進入此項目頁面
規則引擎 Drools:WorkBench動态規則
第二步:點選Add Asset按鈕選擇“資料對象”
規則引擎 Drools:WorkBench動态規則
第三步:在彈出的建立資料對象視窗中輸入資料對象的名稱,點選确定按鈕完成操作
規則引擎 Drools:WorkBench動态規則
操作完成後可以看到如下:
規則引擎 Drools:WorkBench動态規則
第四步:點選“添加字段”按鈕彈出建立字段視窗
規則引擎 Drools:WorkBench動态規則
第五步:在建立字段視窗中錄入字段Id(其實就是屬性名),選擇類型,點選建立按鈕完成操作
規則引擎 Drools:WorkBench動态規則
完成操作後可以看到剛才建立的字段:
規則引擎 Drools:WorkBench動态規則
可以點選添加字段按鈕繼續建立其他字段:
規則引擎 Drools:WorkBench動态規則
注意添加完字段後需要點選右上角儲存按鈕完成儲存操作:
規則引擎 Drools:WorkBench動态規則
點選源代碼按鈕可以檢視剛才建立的Student對象源碼:
規則引擎 Drools:WorkBench動态規則
點選左上角test項目連結,可以看到目前test項目中已經建立的各種類型的對象:
規則引擎 Drools:WorkBench動态規則

建立DRL規則檔案

第一步:在pro1項目頁面點選右上角Add Asset按鈕,選擇“DRL檔案”,彈出建立DRL檔案視窗
規則引擎 Drools:WorkBench動态規則
第二步:在添加DRL檔案視窗錄入DRL檔案名稱,點選确定按鈕完成操作
規則引擎 Drools:WorkBench動态規則
第三步:上面點選确定按鈕完成建立DRL檔案後,頁面會跳轉到編輯DRL檔案頁面
規則引擎 Drools:WorkBench動态規則
可以看到DRL規則檔案頁面分為兩個部分:左側為項目浏覽視圖、右側為編輯區域,需要注意的是左側預設展示的不是項目浏覽視圖,需要點選上面設定按鈕,選擇“資料庫視圖”和“顯示為檔案夾”,如下圖所示:
規則引擎 Drools:WorkBench動态規則
第四步:在編輯DRL檔案頁面右側區域進行DRL檔案的編寫,點選右上角儲存按鈕完成儲存操作,點選檢驗按鈕進行規則檔案文法檢查
規則引擎 Drools:WorkBench動态規則
點選左上角test項目回到項目頁面,可以看到此項目下已經存在兩個對象,即Student.drl規則檔案和Student類:
規則引擎 Drools:WorkBench動态規則

建立測試場景

前面已經建立了Student資料對象和Student規則檔案,現在需要測試一下規則檔案中的規則,可以通過建立測試場景來進行測試。

第一步:在項目頁面點選Add Asset按鈕選擇“測試場景”,彈出建立測試場景視窗
規則引擎 Drools:WorkBench動态規則
第二步:在彈出的建立測試場景視窗中錄入測試場景的名稱,點選确定完成操作
規則引擎 Drools:WorkBench動态規則
完成測試場景的建立後,頁面會跳轉到測試場景編輯頁面,如下圖:
規則引擎 Drools:WorkBench動态規則
第三步:因為編寫的規則檔案中需要從工作記憶體中擷取Student對象進行規則比對,是以在測試場景中需要準備Student對象給工作記憶體,點選“GIVEN”按鈕彈出建立資料錄入視窗,選擇Student類,輸入框中輸入事實名稱(名稱任意),如下圖
規則引擎 Drools:WorkBench動态規則
第四步:錄入事實名稱後點選後面的添加按鈕,可以看到Student對象已經添加成功
規則引擎 Drools:WorkBench動态規則
第五步:給工作記憶體提供的Student對象還需要設定age屬性的值,點選“添加字段”按鈕彈出視窗,選擇age屬性
規則引擎 Drools:WorkBench動态規則
點選确定按鈕後可以看到字段已經添加成功:
規則引擎 Drools:WorkBench動态規則
第六步:點選age屬性後面的編輯按鈕,彈出字段值視窗
規則引擎 Drools:WorkBench動态規則
第七步:在彈出的視窗中點選字面值按鈕,重新回到測試場景頁面,可以看到age後面出現輸入框,可以為age屬性設定值
規則引擎 Drools:WorkBench動态規則

設定好age屬性的值後點選儲存按鈕儲存測試場景

第八步:點選右上角“運作測試場景”按鈕進行測試

規則引擎 Drools:WorkBench動态規則
顯示測試成功,但是沒有觸發規則,繼續添加name屬性測試,檢視WorkBench部署的Tomcat控制台
規則引擎 Drools:WorkBench動态規則

設定KieBase和KieSession

第一步:在test項目頁面點選Settings按鈕進入設定頁面
規則引擎 Drools:WorkBench動态規則
第二步:在設定頁面選擇“KIE bases”選項
規則引擎 Drools:WorkBench動态規則
第三步:在彈出的知識庫和會話頁面點選“Add KIE base”按鈕進行設定
規則引擎 Drools:WorkBench動态規則
第四步:添加Package
規則引擎 Drools:WorkBench動态規則
第五步:添加KIE sessions
規則引擎 Drools:WorkBench動态規則
第六步:設定完成後點選左下角Save按鈕完成設定操作,可以通過左側浏覽視圖點選kmodule.xml,檢視檔案内容
規則引擎 Drools:WorkBench動态規則
規則引擎 Drools:WorkBench動态規則

編譯、建構、部署

前面已經在WorkBench中建立了一個空間javakf,并且在此空間中建立了一個項目test,在此項目中建立了資料檔案、規則檔案和測試場景,如下圖:
規則引擎 Drools:WorkBench動态規則
點選Bulid和Deploy按鈕進行建構和部署。
規則引擎 Drools:WorkBench動态規則
部署成功後可以在本地maven倉庫中看到目前項目已經被打成jar包:
規則引擎 Drools:WorkBench動态規則
将test-1.0.0.jar進行解壓,可以看到建立的資料對象Student和規則檔案Student以及kmodule.xml都已經打到jar包中了。

在項目中使用部署的規則

前面已經在WorkBench中建立了test項目,并且在test項目中建立了資料檔案規則檔案等。最後将此項目打成jar包部署到了maven倉庫中。下面就需要在外部項目中使用我們定義的規則。

第一步:導入相關坐标
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>7.10.0.Final</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
           
第二步:在項目中建立一個資料對象Student,需要和WorkBench中建立的Student包名、類名完全相同,屬性也需要對應,可以直接複制WorkBench中的對象到項目中使用。
package com.javakf.test;

/**
 * This class was automatically generated by the data modeler tool.
 */

public class Student implements java.io.Serializable {

    static final long serialVersionUID = 1L;

    private java.lang.Long id;
    private java.lang.String name;
    private int age;

    public Student() {
    }

    public java.lang.Long getId() {
        return this.id;
    }

    public void setId(java.lang.Long id) {
        this.id = id;
    }

    public java.lang.String getName() {
        return this.name;
    }

    public void setName(java.lang.String name) {
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Student(java.lang.Long id, java.lang.String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

}
           
第三步:編寫單元測試,遠端加載maven倉庫中的jar包最終完成規則調用
@Test
public void test() throws Exception {
	//通過此URL可以通路到maven倉庫中的jar包
	//URL位址構成:http://ip位址:Tomcat端口号/WorkBench工程名/maven2/坐标/版本号/xxx.jar
	String url = "http://localhost:8080/kie-drools-wb/maven2/com/javakf/test/1.0.0/test-1.0.0.jar";

	KieServices kieServices = KieServices.Factory.get();

	//通過Resource資源對象加載jar包
	UrlResource resource = (UrlResource) kieServices.getResources().newUrlResource(url);
	//通過Workbench提供的服務來通路maven倉庫中的jar包資源,需要先進行Workbench的認證
	resource.setUsername("kie");
	resource.setPassword("kie");
	resource.setBasicAuthentication("enabled");

	//将資源轉換為輸入流,通過此輸入流可以讀取jar包資料
	InputStream inputStream = resource.getInputStream();

	//建立倉庫對象,倉庫對象中儲存Drools的規則資訊
	KieRepository repository = kieServices.getRepository();

	//通過輸入流讀取maven倉庫中的jar包資料,包裝成KieModule子產品添加到倉庫中
	KieModule kieModule = repository.addKieModule(kieServices.getResources().newInputStreamResource(inputStream));

	//基于KieModule子產品建立容器對象,從容器中可以擷取session會話
	KieContainer kieContainer = kieServices.newKieContainer(kieModule.getReleaseId());

	KieSession kieSession = kieContainer.newKieSession();

	Student student = new Student();
	student.setAge(5);
	student.setName("小明");
	kieSession.insert(student);

	kieSession.fireAllRules();
	kieSession.dispose();
}
           

執行單元測試可以發現控制台已經輸出了相關内容。修改WorkBench規則輸出内容并釋出,再次執行單元測試可以發現控制台輸出的内容也發生了變化。

這種開發方式的好處是我們的應用可以和業務規則完全分離,同時通過WorkBench修改規則後我們的應用不需要任何修改就可以加載到最新的規則進而實作規則的動态變更。

繼續閱讀