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 配置类
@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("触发规定:" + 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 触发规定
@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