乐趣区

关于java:SpringBoot集成drools

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 配置类

@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

退出移动版