在之前的文章中,我们学习了drools
的一些基本语法,在这篇文章中,我们实现在SpringBoot
中集成drools
。
我们需要在drools
中判断用户是否可以玩游戏。
规则一:
如果用户的年龄age>=18
,则可以
玩游戏。
规则二:
如果用户的年龄age<18
,则不可以
玩游戏。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.droolsgroupId>
<artifactId>drools-bomartifactId>
<type>pomtype>
<version>7.69.0.Finalversion>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>2.6.7version>
<scope>importscope>
<type>pomtype>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.droolsgroupId>
<artifactId>drools-compilerartifactId>
dependency>
<dependency>
<groupId>org.droolsgroupId>
<artifactId>drools-mvelartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.22version>
dependency>
dependencies>
此处引入drools
和springboot
的jar
包。
@Configuration
public class DroolsConfig {
@Bean
public KieContainer kieContainer() {
KieServices kieServices = KieServices.get();
return kieServices.getKieClasspathContainer();
}
}
此处可以简单的理解为drools
中的Fact
对象。插入到drools中的工作内存后就是Fact
对象。
@Data
@AllArgsConstructor
public class Person {
private String name;
private Integer age;
// 是否可以玩游戏,此字段的值,由 drools 引擎计算得出
private Boolean canPlayGame;
}
canPlayGame
:此字段的值是由drools
引擎计算得出的。
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
。
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>
@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;
}
}
➜ curl http://localhost:8081/canPlayGame\?name\=huan\&age\=20
{"name":"huan","age":20,"canPlayGame":true}
可以看出drools中计算出来的canPlayGame
值为`true
➜ curl http://localhost:8081/canPlayGame\?name\=huan\&age\=16
{"name":"huan","age":20,"canPlayGame":false}
可以看出drools中计算出来的canPlayGame
值为false
https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-integrated-springboot