一、什麼叫規則引擎?
規則---》寫在文檔上
引擎---》在java代碼上,引用這個文檔上的規則
二、drools規則引擎有什麼用?
簡單來說就是将多變的規則,從業務代碼中剝離出來
(當規則變了之後,不用修改代碼,而是修改一份文本,這樣就可以不用編譯,打包,上線,這些過程就省略了,省了很多時間呀!!也省了很多重複步驟!!)
三、這個規則引擎的應用場景有哪一些?
風控系統(規則很多,而且容易變動,做網際網路金融的同志深有體會)
活動營銷系統(活動很多種,集積分送禮品,抽獎送禮品,競争成功送禮品等等不同形式,這裡可以變成不同的規則)
商品折扣系統(同一個商品,不同的使用者,每個使用者有不同的折扣優惠)
積分系統
個人總結:
有人會問,如果把規則,寫在java代碼上,同樣也能實作功能呀,為什麼還要單獨弄一份文檔出來,另外去讀取它,這樣操作呢?分離這些規則,很麻煩呀。當然,任何事情都有雙面性。在架構選型的時候,要充分認識到drools的使用和各種因素,才能決定是否在實際項目中使用它。總結一句話,規則多變,則可以選用。(功能可以簡單地了解成 java中的政策模式,switch功能)
==================================================================
四、将drools規則融入到項目中。本文主要介紹drools7的從0開始,目前有一個簡單的需求:
某汽車舉行活動,年齡超過60,打8折,其他年齡打9折,請用drools7來實作。
(本文是用IDEA來做,用eclipse的同學,請先百度一下,drools ecplies的運作環境安裝,按步驟安裝完就可以了)
1、添加maven依賴包
- <dependency>
- <groupId>org.drools</groupId>
- <artifactId>drools-core</artifactId>
- <version>7.7.0.Final</version>
- </dependency>
- <dependency>
- <groupId>org.drools</groupId>
- <artifactId>drools-compiler</artifactId>
- <version>7.7.0.Final</version>
- </dependency>
- <dependency>
- <groupId>org.drools</groupId>
- <artifactId>drools-templates</artifactId>
- <version>7.7.0.Final</version>
- </dependency>
2、建立一個xml,注意一定要放在META-INF檔案夾下,drools會自動解析它
- <?xml version="1.0" encoding="UTF-8"?>
- <kmodule xmlns="http://www.drools.org/xsd/kmodule">
- <kbase name="rules">
- <ksession name="all-rules"/>
- </kbase>
- </kmodule>
3、
- @Test
- public void testDrool7Api(){
- KieServices kieServices = KieServices.Factory.get(); // 通過這個靜态方法去擷取一個執行個體
- KieContainer kieContainer = kieServices.getKieClasspathContainer();// 預設去讀取配置檔案
- KieSession kieSession = kieContainer.newKieSession("all-rules");// 根據這個名詞去擷取kieSession
- Person p1 = new Person();
- p1.setAge(30);
- Car c1 = new Car();
- c1.setPerson(p1);
- Person p2 = new Person();
- p1.setAge(70);
- Car c2 = new Car();
- c2.setPerson(p2);
- kieSession.insert(c1); // 将c1執行個體放入到session中,
- kieSession.insert(c2); //
- int count = kieSession.fireAllRules();// 開始執行規則,并擷取執行了多少條規則
- kieSession.dispose();// 關閉session
- System.out.println("Fire " + count + " rule(s)!");
- System.out.println("The discount of c1 is " + c1.getDiscount() + "%");
- System.out.println("The discount of c2 is " + c2.getDiscount() + "%");
- }
4、注意路徑
package com.rules
import com.drools.model.Car
import com.drools.model.Person
rule "test-drool7-older than 60"
when
$Car : Car( person.age > 60)
then
$Car.setDiscount(80);
System.out.println("test-drool7-older than 60"+$Car.getPerson().getAge());
end
rule "test-drool7-other"
when
$Car : Car( person.age<=60)
then
$Car.setDiscount(70);
System.out.println("test-drool7-other"+$Car.getPerson().getAge());
end
5、結果:
原文位址:https://blog.csdn.net/weixin_37662342/article/details/80773027