SpringBoot如何实现与drools的深度集成?

2026-05-25 04:441阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1105个文字,预计阅读时间需要5分钟。

SpringBoot如何实现与drools的深度集成?

目录+1、背景+2、需求+3、实现+3.1、引入jar包+3.2、编写drools配置类+3.3、编写Person对象+3.4、编写drl文件+3.5、编写kmodule.xml文件+3.6、编写Controller触发规则+3.7、测试+3.7.1、用户年龄=18岁+3.7.2、用户年龄>18岁

目录
  • 1、背景
  • 2、需求
  • 3、实现
    • 3.1 引入jar包
    • 3.2 编写drools配置类
    • 3.3 编写Person对象
    • 3.4 编写drl文件
    • 3.5 编写kmodule.xml文件
    • 3.6 编写Controller触发规则
    • 3.7 测试
      • 3.7.1 用户的年龄>=18岁
      • 3.7.2 用户的年龄<18岁
  • 4、完整代码

1、背景

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

2、需求

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

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

SpringBoot如何实现与drools的深度集成?

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="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 localhost:8081/canPlayGame\?name\=huan\&age\=20 {"name":"huan","age":20,"canPlayGame":true}

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

3.7.2 用户的年龄<18岁

➜ curl localhost:8081/canPlayGame\?name\=huan\&age\=16 {"name":"huan","age":20,"canPlayGame":false}

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

4、完整代码

gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-integrated-springboot

本文共计1105个文字,预计阅读时间需要5分钟。

SpringBoot如何实现与drools的深度集成?

目录+1、背景+2、需求+3、实现+3.1、引入jar包+3.2、编写drools配置类+3.3、编写Person对象+3.4、编写drl文件+3.5、编写kmodule.xml文件+3.6、编写Controller触发规则+3.7、测试+3.7.1、用户年龄=18岁+3.7.2、用户年龄>18岁

目录
  • 1、背景
  • 2、需求
  • 3、实现
    • 3.1 引入jar包
    • 3.2 编写drools配置类
    • 3.3 编写Person对象
    • 3.4 编写drl文件
    • 3.5 编写kmodule.xml文件
    • 3.6 编写Controller触发规则
    • 3.7 测试
      • 3.7.1 用户的年龄>=18岁
      • 3.7.2 用户的年龄<18岁
  • 4、完整代码

1、背景

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

2、需求

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

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

SpringBoot如何实现与drools的深度集成?

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="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 localhost:8081/canPlayGame\?name\=huan\&age\=20 {"name":"huan","age":20,"canPlayGame":true}

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

3.7.2 用户的年龄<18岁

➜ curl localhost:8081/canPlayGame\?name\=huan\&age\=16 {"name":"huan","age":20,"canPlayGame":false}

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

4、完整代码

gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-integrated-springboot