參考: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();操作數據庫等等一切操作