SpringBoot集成drools的實現(xiàn)示例
1、背景
在之前的文章中,我們學習了drools的一些基本語法,在這篇文章中,我們實現(xiàn)在SpringBoot中集成drools。
2、需求
我們需要在drools中判斷用戶是否可以玩游戲。
- 規(guī)則一:如果用戶的年齡age>=18,則可以玩游戲。
- 規(guī)則二:如果用戶的年齡age<18,則不可以玩游戲。
3、實現(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對象
此處可以簡單的理解為drools中的Fact對象。插入到drools中的工作內(nèi)存后就是Fact對象。
@Data
@AllArgsConstructor
public class Person {
private String name;
private Integer age;
// 是否可以玩游戲,此字段的值,由 drools 引擎計算得出
private Boolean canPlayGame;
}canPlayGame:此字段的值是由drools引擎計算得出的。
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個規(guī)則,都是根據(jù)age來進行判斷的,從而計算出用戶是否可以玩游戲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 測試
3.7.1 用戶的年齡>=18歲
? curl http://localhost:8081/canPlayGame\?name\=huan\&age\=20
{"name":"huan","age":20,"canPlayGame":true}
可以看出drools中計算出來的canPlayGame值為`true
3.7.2 用戶的年齡<18歲
? curl http://localhost:8081/canPlayGame\?name\=huan\&age\=16
{"name":"huan","age":20,"canPlayGame":false}
可以看出drools中計算出來的canPlayGame值為false
4、完整代碼
https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-integrated-springboot
到此這篇關(guān)于SpringBoot集成drools的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot集成drools內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JVM性能調(diào)優(yōu)實現(xiàn)原理及配置
這篇文章主要介紹了JVM性能調(diào)優(yōu)實現(xiàn)原理及配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-12-12
Springboot使用POI進行excel文件的導出與下載方式
這篇文章主要介紹了Springboot使用POI進行excel文件的導出與下載方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
Java Management Extensions管理擴展原理解析
這篇文章主要介紹了Java Management Extensions管理擴展原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04

