SpringBoot整合 drools規則引擎 系列教程(二)Drools規則語法 & LHS 條件java
教程代碼已提交到ytooo-drools,歡迎stargit
規則引擎由推理引擎發展而來,是一種嵌入在應用程序中的組件,
實現了將業務決策從應用程序代碼中分離出來,並使用預約義的語義模塊編寫業務決策。
接受數據輸入,解釋業務規則,並根據業務規則作出業務決策。github
簡單來講包括像表單驗證和動態表達式引擎這樣的簡單系統均可以稱之爲規則引擎。web
複雜企業級項目的開發以及其中隨外部條件不斷變化的業務規則(business logic),
迫切須要分離商業決策者的商業決策邏輯和應用開發者的技術決策,
並把這些商業決策放在中心數據庫或其餘統一的地方,讓它們能在運行時(即商務時間)
能夠動態地管理和修改從而提供軟件系統的柔性和適應性。規則引擎正是應用於上述動態環境中的一種解決方法。算法
企業管理者對企業級IT系統的開發有着以下的要求:
爲提升效率,管理流程必須自動化,即便現代商業規則異常複雜;
市場要求業務規則常常變化,IT系統必須依據業務規則的變化快速、低成本的更新;
爲了快速、低成本的更新,業務人員應能直接管理IT系統中的規則,不須要程序開發人員參與。spring
使用了規則引擎以後,許多涉及業務邏輯的程序代碼基本被這五個典型步驟數據庫
Drools 是用 Java 語言編寫的具備一個易於訪問企業策略、易於調整以及易於管理的開源業務規則引擎
,其基於CHARLES FORGY'S的RETE算法
符合業內標準,速度快且效率高。 業務分析師人員或審覈人員能夠利用它輕鬆查看業務規則,
檢驗已編碼的規則執行了所需的業務規則。編程
<properties> <java.version>1.8</java.version> <drools.version>7.14.0.Final</drools.version> </properties> <dependencies> <!-- drools依賴 --> <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>${drools.version}</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>${drools.version}</version> </dependency> <!-- 決策表 --> <dependency> <groupId>org.drools</groupId> <artifactId>drools-decisiontables</artifactId> <version>${drools.version}</version> </dependency> <!-- 模板 --> <dependency> <groupId>org.drools</groupId> <artifactId>drools-templates</artifactId> <version>${drools.version}</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> <version>${drools.version}</version> </dependency> </dependencies>
@Configuration public class KiaSessionConfig { @Bean public KieSession getSession() { KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); return kContainer.newKieSession("ksession-rules"); } }
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"> <kbase name="rules" packages="rules"> <ksession name="ksession-rules"/> </kbase> </kmodule>
package com.ytooo.bean import com.ytooo.bean.People dialect "java" rule "man" when $p : People(sex == 1 && drlType == "people") then System.out.println($p.getName() + "是男孩"); end
package com.ytooo.bean import com.ytooo.bean.People dialect "java" rule "girl" when $p : People(sex == 0 && drlType == "people") then System.out.println($p.getName() + "是女孩"); end
drools中,規則是使用對象來匹配規則的,如上面兩個規則文件,在java中執行People對象的規則時,兩種規則都會觸發segmentfault
package com.ytooo.bean; import lombok.Data; /** * Created by Youdmeng on 2020/1/7 0007. */ @Data public class People { private int sex; private String name; private String drlType; public People(int sex, String name, String drlType) { this.sex = sex; this.name = name; this.drlType = drlType; } public People() { } }
package com.ytooo; import com.ytooo.bean.People; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.kie.api.runtime.KieSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @SpringBootTest @RunWith(SpringRunner.class) class DroolsApplicationTests { @Autowired private KieSession session; @Test public void people() { People people = new People(); people.setName("達"); people.setSex(1); people.setDrlType("people"); session.insert(people);//插入 session.fireAllRules();//執行規則 } @AfterEach public void runDispose() { session.dispose();//釋放資源 } }
達是男孩
達是女孩
package com.ytooo.bean; import lombok.Data; /** * Created by Youdmeng on 2020/1/7 0007. */ @Data public class Cat { private int sex; private String name; }
@Test public void cat() { Cat cat = new Cat(); cat.setName("金"); cat.setSex(1); session.insert(cat);//插入 session.fireAllRules();//執行規則 }
傳入sex爲1或0,都沒有結果輸出api
相同.drl文件中能夠繼承多組規則如:
package com.ytooo.bean import com.ytooo.bean.People dialect "java" rule "man" when $p : People(sex == 1 && drlType == "people") then System.out.println($p.getName() + "是男孩"); end rule "cat" when $c : Cat(sex == 1 && $c.getName().equals("金")) then System.out.println($c.getName() + "是公的"); end
教程代碼已提交到ytooo-drools,歡迎star