SpringBoot集成drools的實現示例
1、背景
在之前的文章中,我們學習了drools的一些基本語法,在這篇文章中,我們實現在SpringBoot中集成drools。
2、需求
我們需要在drools中判斷用戶是否可以玩游戲。
- 規(guī)則一:如果用戶的年齡age>=18,則可以玩游戲。
- 規(guī)則二:如果用戶的年齡age<18,則不可以玩游戲。
3、實現
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中的工作內存后就是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ī)則,都是根據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; ? ? } ? ? /** ? ? ?* 調用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
到此這篇關于SpringBoot集成drools的實現示例的文章就介紹到這了,更多相關SpringBoot集成drools內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
spring boot中interceptor攔截器未生效的解決
這篇文章主要介紹了spring boot中interceptor攔截器未生效的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-091秒鐘實現Springboot?替換/寫入?word文檔里面的文字、圖片功能
這篇文章主要介紹了Springboot?替換/寫入?word文檔里面的文字、圖片,1秒鐘實現,本文結合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-12-12FreeMarker如何調用Java靜態(tài)方法及靜態(tài)變量方法
這篇文章主要介紹了FreeMarker如何調用Java靜態(tài)方法及靜態(tài)變量方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12