时间:2023-02-24 09:15:58 | 栏目:JAVA代码 | 点击:次
在之前的文章中,我们学习了drools的一些基本语法,在这篇文章中,我们实现在SpringBoot中集成drools。
我们需要在drools中判断用户是否可以玩游戏。
<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包。
@Configuration public class DroolsConfig { @Bean public KieContainer kieContainer() { KieServices kieServices = KieServices.get(); return kieServices.getKieClasspathContainer(); } }
此处可以简单的理解为drools中的Fact对象。插入到drools中的工作内存后就是Fact对象。
@Data @AllArgsConstructor public class Person { private String name; private Integer age; // 是否可以玩游戏,此字段的值,由 drools 引擎计算得出 private Boolean canPlayGame; }
canPlayGame:此字段的值是由drools引擎计算得出的。
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。
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>
@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.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
https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-integrated-springboot