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 編寫(xiě)drools配置類
@Configuration
public class DroolsConfig {
? ? @Bean
? ? public KieContainer kieContainer() {
? ? ? ? KieServices kieServices = KieServices.get();
? ? ? ? return kieServices.getKieClasspathContainer();
? ? }
}3.3 編寫(xiě)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 編寫(xiě)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上方編寫(xiě)了2個(gè)規(guī)則,都是根據(jù)age來(lái)進(jìn)行判斷的,從而計(jì)算出用戶是否可以玩游戲canPlayGame。
3.5 編寫(xiě)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 編寫(xiě)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)文章
JVM性能調(diào)優(yōu)實(shí)現(xiàn)原理及配置
這篇文章主要介紹了JVM性能調(diào)優(yōu)實(shí)現(xiàn)原理及配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
java反射_改變private中的變量及方法的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇java反射_改變private中的變量及方法的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06
Springboot使用POI進(jìn)行excel文件的導(dǎo)出與下載方式
這篇文章主要介紹了Springboot使用POI進(jìn)行excel文件的導(dǎo)出與下載方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
springboot應(yīng)用中使用過(guò)濾器的過(guò)程詳解
過(guò)濾器通常用于實(shí)現(xiàn)跨切面的功能,例如身份驗(yàn)證、日志記錄、請(qǐng)求和響應(yīng)的修改、性能監(jiān)控等,這篇文章主要介紹了springboot應(yīng)用中使用過(guò)濾器,需要的朋友可以參考下2023-06-06
Java Management Extensions管理擴(kuò)展原理解析
這篇文章主要介紹了Java Management Extensions管理擴(kuò)展原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04

