美文网首页
SpringBoot集成drools

SpringBoot集成drools

作者: huan1993 | 来源:发表于2022-05-26 10:06 被阅读0次

    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

    相关文章

      网友评论

          本文标题:SpringBoot集成drools

          本文链接:https://www.haomeiwen.com/subject/vljuprtx.html