SpringBoot集成drools
huan_1993 人气:01、背景
在之前的文章中,我们学习了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>
此处引入drools和springboot的jar包。
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
加载全部内容