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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Spring Boot项目中集成Drools,可以按照以下步骤进行操作: 1. 首先,创建一个Spring Boot项目。你可以参考这篇博客【Spring Boot】快速上手SpringBoot来创建项目。 2. 引入Drools的依赖。你可以在项目的pom.xml文件中添加如下依赖: ``` <dependency> <groupId>com.github.hongwen1993</groupId> <artifactId>fast-drools-spring-boot-starter</artifactId> <version>8.0.8</version> </dependency> ``` 3. 修改配置文件。在配置文件中,你需要修改`spring.drools.path`部分,指定Drools规则文件的路径。你可以使用类似以下的配置: ``` spring.drools.path=classpath:drools/**/*.drl ``` 4. 创建测试类。在测试类中,你需要注入`KieTemplate`,并使用`KieSession`加载规则文件并执行规则。你可以参考以下示例代码: ``` @Autowired private KieTemplate kieTemplate; @Before public void before() throws InterruptedException { Thread.sleep(1000); } @Test void test02() throws Exception { KieSession session = kieTemplate.getKieSession("rule01.drl"); UserInfo userInfo = new UserInfo(); userInfo.setName("李"); session.insert(userInfo); session.fireAllRules(); session.dispose(); } ``` 通过以上步骤,你就可以在Spring Boot项目中成功集成Drools了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SpringBoot整合Drools](https://blog.csdn.net/qq_43466788/article/details/120916500)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值