SpringBoot集成drools

发布时间:2023-09-18 19:30

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
    

此处引入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目录下。


    
        
            
            
                
                
                
            
        
    

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

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号