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>

此处引入droolsspringbootjar包。

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