服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - SpringBoot集成drools的实现示例

SpringBoot集成drools的实现示例

2022-12-25 16:44huan_1993 Java教程

本文主要介绍了SpringBoot集成drools的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、背景

在之前的文章中,我们学习了drools的一些基本语法,在这篇文章中,我们实现在SpringBoot中集成drools。

2、需求

我们需要在drools中判断用户是否可以玩游戏。

  • 规则一:如果用户的年龄age>=18,则可以玩游戏。
  • 规则二:如果用户的年龄age<18,则不可以玩游戏。

3、实现

3.1 引入jar包

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<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配置类

?
1
2
3
4
5
6
7
8
9
@Configuration
public class DroolsConfig {
 
    @Bean
    public KieContainer kieContainer() {
        KieServices kieServices = KieServices.get();
        return kieServices.getKieClasspathContainer();
    }
}

3.3 编写Person对象

此处可以简单的理解为drools中的Fact对象。插入到drools中的工作内存后就是Fact对象。

?
1
2
3
4
5
6
7
8
@Data
@AllArgsConstructor
public class Person {
    private String name;
    private Integer age;
    // 是否可以玩游戏,此字段的值,由 drools 引擎计算得出
    private Boolean canPlayGame;
}

canPlayGame:此字段的值是由drools引擎计算得出的。

3.4 编写drl文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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目录下。

?
1
2
3
4
5
6
7
8
9
10
11
12
<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触发规则

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@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岁

?
1
2
➜ curl http://localhost:8081/canPlayGame\?name\=huan\&age\=20
{"name":"huan","age":20,"canPlayGame":true} 

可以看出drools中计算出来的canPlayGame值为`true

3.7.2 用户的年龄<18岁

?
1
2
➜ 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

到此这篇关于SpringBoot集成drools的实现示例的文章就介绍到这了,更多相关SpringBoot集成drools内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/fu_huo_1993/article/details/124971190

延伸 · 阅读

精彩推荐