SpringBoot集成drools的實(shí)現(xiàn)示例
1、背景
在之前的文章中,我們學(xué)習(xí)了drools的一些基本語(yǔ)法,在這篇文章中,我們實(shí)現(xiàn)在SpringBoot中集成drools。
2、需求
我們需要在drools中判斷用戶是否可以玩游戲。
- 規(guī)則一:如果用戶的年齡age>=18,則可以玩游戲。
- 規(guī)則二:如果用戶的年齡age<18,則不可以玩游戲。
3、實(shí)現(xiàn)
3.1 引入jar包
<dependencyManagement> ? ? <dependencies> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>org.drools</groupId> ? ? ? ? ? ? <artifactId>drools-bom</artifactId> ? ? ? ? ? ? <type>pom</type> ? ? ? ? ? ? <version>7.69.0.Final</version> ? ? ? ? ? ? <scope>import</scope> ? ? ? ? </dependency> ? ? ? ? <dependency> ? ? ? ? ? ? <groupId>org.springframework.boot</groupId> ? ? ? ? ? ? <artifactId>spring-boot-dependencies</artifactId> ? ? ? ? ? ? <version>2.6.7</version> ? ? ? ? ? ? <scope>import</scope> ? ? ? ? ? ? <type>pom</type> ? ? ? ? </dependency> ? ? </dependencies> </dependencyManagement> <dependencies> ? ? <dependency> ? ? ? ? <groupId>org.springframework.boot</groupId> ? ? ? ? <artifactId>spring-boot-starter-web</artifactId> ? ? </dependency> ? ? <dependency> ? ? ? ? <groupId>org.drools</groupId> ? ? ? ? <artifactId>drools-compiler</artifactId> ? ? </dependency> ? ? <dependency> ? ? ? ? <groupId>org.drools</groupId> ? ? ? ? <artifactId>drools-mvel</artifactId> ? ? </dependency> ? ? <dependency> ? ? ? ? <groupId>org.projectlombok</groupId> ? ? ? ? <artifactId>lombok</artifactId> ? ? ? ? <version>1.18.22</version> ? ? </dependency> </dependencies>
此處引入drools和springboot的jar包。
3.2 編寫drools配置類
@Configuration
public class DroolsConfig {
? ? @Bean
? ? public KieContainer kieContainer() {
? ? ? ? KieServices kieServices = KieServices.get();
? ? ? ? return kieServices.getKieClasspathContainer();
? ? }
}3.3 編寫Person對(duì)象
此處可以簡(jiǎn)單的理解為drools中的Fact對(duì)象。插入到drools中的工作內(nèi)存后就是Fact對(duì)象。
@Data
@AllArgsConstructor
public class Person {
private String name;
private Integer age;
// 是否可以玩游戲,此字段的值,由 drools 引擎計(jì)算得出
private Boolean canPlayGame;
}canPlayGame:此字段的值是由drools引擎計(jì)算得出的。
3.4 編寫drl文件
package rules
import com.huan.drools.fact.Person
// 用戶可以玩游戲
rule "rule_person_can_play_game"
? ? when
? ? ? ? $person: Person( age >= 18)
? ? then
? ? ? ? $person.setCanPlayGame(true);
? ? ? ? System.out.println("觸發(fā)規(guī)則:" + drools.getRule().getName());
end
// 用戶不可以玩游戲
rule "rule_person_Can't_play_game"
? ? when
? ? ? ? $person: Person( age < 18)
? ? then
? ? ? ? $person.setCanPlayGame(false);
? ? ? ? System.out.println("觸發(fā)規(guī)則:" + drools.getRule().getName());
end上方編寫了2個(gè)規(guī)則,都是根據(jù)age來(lái)進(jìn)行判斷的,從而計(jì)算出用戶是否可以玩游戲canPlayGame。
3.5 編寫kmodule.xml文件
kmodule.xml的路徑位于 src/main/resources/META-INF目錄下。
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="kabse" packages="rules" default="false">
<ksession name="ksession" default="false" type="stateful">
<consoleLogger/>
<listeners>
<ruleRuntimeEventListener type="org.kie.api.event.rule.DebugRuleRuntimeEventListener"/>
<processEventListener type="org.drools.core.event.DebugProcessEventListener"/>
<agendaEventListener type="org.drools.core.event.DebugAgendaEventListener"/>
</listeners>
</ksession>
</kbase>
</kmodule>3.6 編寫Controller觸發(fā)規(guī)則
@RestController
public class PersonController {
? ? private final KieContainer kieContainer;
? ? public PersonController(KieContainer kieContainer) {
? ? ? ? this.kieContainer = kieContainer;
? ? }
? ? /**
? ? ?* 調(diào)用drools rule判斷用戶是否可以玩游戲
? ? ?*/
? ? @GetMapping("canPlayGame")
? ? public Person canPlayGame(Person person) {
? ? ? ? KieSession kieSession = kieContainer.newKieSession("ksession");
? ? ? ? try {
? ? ? ? ? ? kieSession.insert(person);
? ? ? ? ? ? kieSession.fireAllRules();
? ? ? ? } finally {
? ? ? ? ? ? kieSession.dispose();
? ? ? ? }
? ? ? ? return person;
? ? }
}3.7 測(cè)試
3.7.1 用戶的年齡>=18歲
? curl http://localhost:8081/canPlayGame\?name\=huan\&age\=20
{"name":"huan","age":20,"canPlayGame":true}
可以看出drools中計(jì)算出來(lái)的canPlayGame值為`true
3.7.2 用戶的年齡<18歲
? curl http://localhost:8081/canPlayGame\?name\=huan\&age\=16
{"name":"huan","age":20,"canPlayGame":false}
可以看出drools中計(jì)算出來(lái)的canPlayGame值為false
4、完整代碼
https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-integrated-springboot
到此這篇關(guān)于SpringBoot集成drools的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot集成drools內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot中interceptor攔截器未生效的解決
這篇文章主要介紹了spring boot中interceptor攔截器未生效的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
springboot讀取文件,打成jar包后訪問(wèn)不到的解決
這篇文章主要介紹了springboot讀取文件,打成jar包后訪問(wèn)不到的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java向List集合中批量添加元素的實(shí)現(xiàn)方法
這篇文章主要介紹了Java向List集合中批量添加元素的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
idea中如何創(chuàng)建scala項(xiàng)目
idea中創(chuàng)建scala項(xiàng)目有三種方式1.通過(guò)maven;2.通過(guò)idea;3.通過(guò)sbt的方式;本文就每種方法通過(guò)圖文并茂的形式給大家詳細(xì)介紹,需要的朋友參考下吧2021-07-07
1秒鐘實(shí)現(xiàn)Springboot?替換/寫入?word文檔里面的文字、圖片功能
這篇文章主要介紹了Springboot?替換/寫入?word文檔里面的文字、圖片,1秒鐘實(shí)現(xiàn),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
FreeMarker如何調(diào)用Java靜態(tài)方法及靜態(tài)變量方法
這篇文章主要介紹了FreeMarker如何調(diào)用Java靜態(tài)方法及靜態(tài)變量方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12

