1、背景
在之前的文章中,我们学习了drools
的一些基本语法,在这篇文章中,我们实现在SpringBoot
中集成drools
。
2、需求
我们需要在drools
中判断用户是否可以玩游戏。
规则一:
如果用户的年龄age>=18
,则可以
玩游戏。 规则二:
如果用户的年龄age<18
,则不可以
玩游戏。
3、实现
3.1 引入jar包
org.drools
drools-bom
pom
7.69.0.Final
import
org.springframework.boot
spring-boot-dependencies
2.6.7
import
pom
org.springframework.boot
spring-boot-starter-web
org.drools
drools-compiler
org.drools
drools-mvel
org.projectlombok
lombok
1.18.22
此处引入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
目录下。
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