您好,登錄后才能下訂單哦!
本篇內容介紹了“Drools規則引擎的簡單使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
一個給不同商品設置不同折扣的例子
pom.xml
<dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>7.23.0.Final</version> </dependency>
kmodule.xml
文件用于配置規則腳本,可以有多個kbase
文件放在項目resources/META-INF
目錄下可以自動加載
<?xml version="1.0" encoding="UTF-8"?> <kmodule xmlns="http://www.drools.org/xsd/kmodule"> <kbase name="rules" packages="rules"> <ksession name="ksession-rule"/> </kbase> </kmodule>
Product Bean實體
//lombok注解 @Data public class Product { public static final String DIAMOND = "DIAMOND"; public static final String GOLD = "GOLD"; private String type; private int discount; }
resources/rules/Rules.drl
規則腳本
package rules import drools.Product //當商品類型是DIAMOND時,打折為15% rule Offer4Diamond when productObject:Product(type == Product.DIAMOND) then productObject.setDiscount(15); end //當商品類型是GOLD時,打折為25% rule Offer4Gold when productObject: Product(type == Product.GOLD) then productObject.setDiscount(25); end
junit Test
@Test public void droolsTest() { KieServices ks = KieServices.Factory.get(); KieContainer kieContainer = ks.getKieClasspathContainer(); KieSession kSession = kieContainer.newKieSession("ksession-rule"); Product product = new Product(); product.setType(Product.GOLD); kSession.insert(product); int count = kSession.fireAllRules(); System.out.println("命中了" + count + "條規則"); System.out.println("商品" + product.getType() + "的商品折扣為" + product.getDiscount() + "%"); }
運行結果
命中了1條規則 商品GOLD的商品折扣為25%
解釋一下
kmodule.xml
該文件用來配置規則表,可以包含多個kbase,每個kbase都有name屬性,不能重復
kbase可以包含多個ksession, packages屬性是src/main/resources目錄下文件夾的包路徑,可以定義多個包,逗號分隔,packages目錄下的所有規則文件都會被加載,除了子目錄
ksession 的name不能重復,Java代碼中KieSession設置的name就是該配置的name
droolsTest
KieServices
該接口提供了很多方法,可以通過這些方法訪問KIE關于構建和運行的相關對象,比如說可以獲取KieContainer,利用KieContainer來訪問KBase和KSession等信息;可以獲取KieRepository對象,利用KieRepository來管理KieModule等。
KieServices就是一個中心,通過它來獲取的各種對象來完成規則構建、管理和執行等操作。
KieContainer
KieContainer可以理解為是一個KieBase的容器。
KieBase
KieBase可以理解為是一個知識倉庫,包含了若干的規則、流程、方法等,在Drools中主要就是規則和方法,KieBase本身并不包含運行時的數據之類的,如果需要執行規則KieBase中的規則的話,就需要根據KieBase創建KieSession。
KieSession
KieSession就是一個跟Drools引擎打交道的會話,其基于KieBase創建,它會包含運行時數據,包含“事實 Fact”,并對運行時數據事實進行規則運算。我們通過KieContainer創建KieSession是一種較為方便的做法,其實他本質上是從KieBase中創建出來
實現動態規則有這幾種思路
1. 使用Workbench,通過Web管理頁面動態生成配置規則
2. 將規則以字符串的形式存入數據庫,需要自己開發一套規則管理系統
1.docker部署workbench
workbench
docker run -p 8080:8080 -p 8001:8001 -d --name drools-wb jboss/drools-workbench-showcase:7.5.0.Final
kie-server
docker run -p 8180:8180 -d --name kie-server --link drools-wb:kie_wb jboss/kie-server-showcase:7.5.0.Final
訪問http://ip地址:8080/drools-wb
默認賬號/密碼 admin/admin
2.創建項目
3.創建Object
4.創建DRL文件
5.部署
6.使用部署的規則文件
遠程規則Maven倉庫地址獲取
本地Maven倉庫settings.xml配置,這里只摘錄了需要添加的3處,需要對應去添加
<server> <username>admin</username> <password>admin</password> <id>guvnor-m2-repo</id> </server> <profile> <id>guvnor-m2-repo</id> <repositories> <repository> <id>guvnor-m2-repo</id> <name>Guvnor M2 Repo</name> <url>http://10.211.55.7:8080/drools-wb/maven2/</url> <layout>default</layout> <releases> <enabled>true</enabled> <updatePolicy>always</updatePolicy> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <!--更新策略,常常 --> </snapshots> </repository> </repositories> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <activeProfiles> <activeProfile>guvnor-m2-repo</activeProfile> </activeProfiles>
創建一個標準的SpringBoot工程
Product
實體,包路徑要跟規則文件中的一致
@Data public class Product { private String type; private int discount; }
DroolsController.java
@RestController @RequestMapping("/api/") @Slf4j public class DroolsController { @PostMapping("getdiscount") public Product getDiscount(Product product) throws IOException { KieServices ks = KieServices.Factory.get(); //RELEASE 代表使用jar包的最新正式版 ReleaseIdImpl releaseId = new ReleaseIdImpl("com.myteam", "test", "RELEASE"); KieContainer kieContainer = ks.newKieContainer(releaseId); //自動掃描Maven倉庫,有新版本會自動下載 KieScanner kieScanner = ks.newKieScanner(kieContainer); kieScanner.start(3000); KieSession kieSession = kieContainer.newKieSession(); kieSession.insert(product); int count = kieSession.fireAllRules(); log.info("共執行了{}條規則", count); log.info("商品{}的折扣為{}%", product.getType(), product.getDiscount()); return product; } }
PostMan訪問接口
與DRL規則文件中配置的一致
7.動態規則
修改ppdrl.drl
規則表,修改GOLD的打折為50%,保存規則,將項目版本提高一個版本,并build&deploy
項目
再次訪問接口,GOLD的折扣已經變為50%
,其中沒有重啟服務
“Drools規則引擎的簡單使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。