1、背景
在之前的文章中,咱们学习了drools
的一些根本语法,在这篇文章中,咱们实现在SpringBoot
中集成drools
。
2、需要
咱们须要在drools
中判断用户是否能够玩游戏。
规定一:
如果用户的年龄age>=18
,则能够
玩游戏。规定二:
如果用户的年龄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配置类
@Configurationpublic class DroolsConfig { @Bean public KieContainer kieContainer() { KieServices kieServices = KieServices.get(); return kieServices.getKieClasspathContainer(); }}
3.3 编写Person对象
此处能够简略的了解为drools
中的Fact
对象。插入到drools中的工作内存后就是Fact
对象。
@Data@AllArgsConstructorpublic class Person { private String name; private Integer age; // 是否能够玩游戏,此字段的值,由 drools 引擎计算得出 private Boolean canPlayGame;}
canPlayGame
:此字段的值是由drools
引擎计算得出的。
3.4 编写drl文件
package rulesimport com.huan.drools.fact.Person// 用户能够玩游戏rule "rule_person_can_play_game" when $person: Person( age >= 18) then $person.setCanPlayGame(true); System.out.println("触发规定:" + drools.getRule().getName());end// 用户不能够玩游戏rule "rule_person_Can't_play_game" when $person: Person( age < 18) then $person.setCanPlayGame(false); System.out.println("触发规定:" + drools.getRule().getName());end
上方编写了2个规定,都是依据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触发规定
@RestControllerpublic 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