Drools規則引擎筆記


參考:https://www.cnblogs.com/jpfss/p/10870002.html

https://blog.csdn.net/hc_ttxs/article/details/85248696

 

一、概述

通常而言我們使用一個接口來做事情,首先要穿進去參數,其次要獲取到接口的實現執行完畢后的結果,而drools也是一樣的,我們需要傳遞進去數據,用於規則的檢查,調用外部接口,同時還可能需要獲取到規則執行完畢后得到的結果。在drools中,這個傳遞數據進去的對象,術語叫 Fact對象

Fact對象是一個普通的java bean,規則中可以對當前的對象進行任何的讀寫操作,調用該對象提供的方法,當一個java bean插入到workingMemory中,規則使用的是原有對象的引用,規則通過對fact對象的讀寫,實現對應用數據的讀寫,對於其中的屬性,需要提供getter setter訪問器,規則中,可以動態的往當前workingMemory中插入刪除新的fact對象。

規則文件可以使用 .drl文件,也可以是xml文件

 

二、規則語法

package:對一個規則文件而言,package是必須定義的,必須放在規則文件第一行。特別的是,package的名字是隨意的,不必必須對應物理路徑,跟java的package的概念不同,這里只是邏輯上的一種區分。同樣的package下定義的function和query等可以直接使用。

比如:package com.drools.demo.point

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

比如:

import com.drools.demo.point.PointDomain;

import com.drools.demo.point.PointDomain.getById;

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

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

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

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

規則事例:

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

no-loop : 定義當前的規則是否不允許多次循環執行,默認是false

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

when:規則條件開始

 

規則的結果部分

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

then
       System.out.println("OK"); //會在控制台打印出ok
end

當然也可以調用Fact的方法,比如  $message.execute();操作數據庫等等一切操作


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM