spring+maven整合Drools規則引擎詳解
阿新 • • 發佈:2018-11-30
最近在弄規則引擎,在網上也找了很多,沒有一篇文章是完整的,基本上你能發現好多都是一個模子刻出來的,在這裡我把我整合的步驟給大家貼出來,供大家參考。
我這邊用的開發工具是Eclpise4.4.2,JDK是1.7,Drools6.5.0Final
1.首先需要在pom.xml中匯入jar
<!-- drools jar start --> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> <version>6.5.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>6.5.0.Final</version> <scope>runtime</scope> </dependency>
2.在resources下面的META-INF中建立kmodule.xml
<?xml version="1.0" encoding="UTF-8"?> <kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"> <kbase name="rules" packages="rules"> <ksession name="ksession-rules"/> </kbase> <kbase name="base" packages="rules.refuse"> <ksession name="session-base"/> </kbase> </kmodule>
kbase是一個規則檔案的配置,其中name是唯一的,packages是規則檔案所在的目錄從resources開始;
ksession 是執行session也是唯一的;
3.建立一個實體Refuse.java
package com.hoomsun.dc.entity; import java.io.Serializable; /** * 拒件實體 * @author Administrator * */ public class Refuse implements Serializable{ /** * 年齡 */ private int age; /** * 工作城市 */ private String workCity; /** * 申請城市 */ private String applyCity; /** * 居住城市 */ private String addressCity; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getWorkCity() { return workCity; } public void setWorkCity(String workCity) { this.workCity = workCity; } public String getApplyCity() { return applyCity; } public void setApplyCity(String applyCity) { this.applyCity = applyCity; } public String getAddressCity() { return addressCity; } public void setAddressCity(String addressCity) { this.addressCity = addressCity; } @Override public String toString() { return "Refuse [age=" + age + ", workCity=" + workCity + ", applyCity=" + applyCity + ", addressCity=" + addressCity + "]"; } }
4.在resources/rules/refuse下面建立規則檔案logic.drl
package com.logic
import com.hoomsun.dc.entity.Refuse
global java.util.Map refuseDate
rule "baseMessage"
no-loop true
lock-on-active true
salience 1
when
$re:Refuse(age>=60||age<22)
then
System.out.println("rrrrrrrrrrrrr==="+refuseDate);
refuseDate.put("name","0");
end
rule "baseMessage2"
no-loop true
lock-on-active true
salience 1
when
$re:Refuse(age>=60||age<22)
then
System.out.println("ccccccccc==="+refuseDate);
refuseDate.put("name","ggggg");
end
rule "baseMessage1"
no-loop true
lock-on-active true
salience 1
when
Refuse(age<60&&age>=22)
then
refuseDate.put("name","0");
System.out.println("hello======= ");
end
- package 與Java語言類似,drl的頭部需要有package和import的宣告,package不必和物理路徑一致。
- import 匯出java Bean的完整路徑,也可以將Java靜態方法匯入呼叫。
- rule 規則名稱,需要保持唯一 件,可以無限次執行。
- no-loop 定義當前的規則是否不允許多次迴圈執行,預設是 false,也就是當前的規則只要滿足條件,可以無限次執行。
- lock-on-active 將lock-on-active屬性的值設定為true,可避免因某些Fact物件被修改而使已經執行過的規則再次被啟用執行。
- salience 用來設定規則執行的優先順序,salience 屬性的值是一個數字,數字越大執行優先順序越高, 同時它的值可以是一個負數。預設情況下,規則的 salience 預設值為 0。如果不設定規則的 salience 屬性,那麼執行順序是隨機的。
- when 條件語句,就是當到達什麼條件的時候
- then 根據條件的結果,來執行什麼動作
- end 規則結束
5.編寫java呼叫程式DroolsTest.java
package com.hoomsun.dc.controller;
import java.util.HashMap;
import java.util.Map;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import com.hoomsun.dc.entity.Refuse;
/**
* This is a sample class to launch a rule.
*/
public class DroolsTest {
public static final void main(String[] args) {
try {
Map<String,String> refuseDate=new HashMap<String, String>();
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("session-base");
Refuse refuse=new Refuse();
refuse.setAge(34);
kSession.setGlobal("refuseDate",refuseDate);
kSession.insert(refuse);
int count=kSession.fireAllRules();
System.out.println("規則執行條數:--------"+count);
System.out.println("規則執行完成--------"+refuse.toString());
System.out.println(kSession.getGlobals().toString());
} catch (Throwable t) {
t.printStackTrace();
}
}
}
執行main方法傳入年齡34,執行結果為:
顯示規則執行了一條,根據name的值可以判斷執行了baseMessage1規則方法,只有這個規則條件滿足執行;
執行main方法傳入年齡80,執行結果為:
顯示規則執行條數為2條,可以看出執行了baseMessage和baseMessage2兩個規則檔案;
好了到這基本的規則引擎使用方法也就講完了,還想了解更多記得關注。。。。。