规则引擎在业务研发中利用频率还是比较高的,尤其是面对繁芜、需灵巧变更的场景更加适宜。以是趁着还算热乎,赶紧再熟习一小下。
Drools--java措辞开拓的开源业务规则引擎DROOLS(JBOSS RULES )具有一个易于访问企业策略、易于调度以及易于管理的开源业务规则引擎,符合业内标准,速率快、效率高。业务剖析师或审核职员可以利用它轻松查看业务规则,从而考验是否已编码的规则实行了所需的业务规则。(www.drools.org.cn/)
xml
复制代码

<!-- Drools依赖 --> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> <version>7.61.0.Final</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-spring</artifactId> <version>7.61.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>7.61.0.Final</version> </dependency>
步骤2:增加kieContainer配置KieContainer是Drools规则引擎的容器,它用于加载和管理规则文件。
通过KieContainer,我们可以获取到规则文件中定义的规则和规则集,并创建相应的KieSession工具。
KieContainer常日在运用程序启动时创建,并在全体运用程序的生命周期中重复利用。
java
复制代码
@Bean public KieContainer kieContainer() { KieServices kieServices = KieServices.get(); KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); // 配置规则文件所在路径 /src/main/resources/myrules/rules.drl kieFileSystem.write(ResourceFactory.newClassPathResource("myrules/rules.drl")); KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem).buildAll(); KieModule kieModule = kieBuilder.getKieModule(); return kieServices.newKieContainer(kieModule.getReleaseId()); }
步骤3: 编写规则文件drl更加繁芜的编写规则可参考: www.drools.org.cn/161.html 这里可以通过全局变量global的办法将SpringBean注入到规则文件中利用。
java
复制代码
package myrules; import com.rules.engine.DroolsTestService import com..Person; // 注入Spring管理的Bean global com.rules.engine.DroolsTestService myService; rule "Adult Rule" when // 将规则赋值给$person变量 $person : Person() // 当参数中的age >=18时,进入then处理 Person(age >= 18) then // 调用Spring管理的Service处理 myService.elderThan18($person); System.out.println("The person is an adult"); end rule "Teenager Rule" when // 将规则赋值给$person变量 $person : Person() // 当参数中的age <18时,进入then处理 Person(age < 18) then // 调用Spring管理的Service处理 myService.youngerThan18($person); System.out.println("The person is a teenager"); end
步骤4: 规则触发这里核心是基于kieSession触发规则。
KieSession是Drools规则引擎的实行环境,它用于实行规则。在KieSession中,我们可以插入事实(Person),并调用规则引擎来匹配规则并实行匹配的规则。
KieSession供应了多种实行规则的方法,例如fireAllRules()用于实行所有匹配的规则。KieSession常日在须要实行规则的时候创建,并在实行完规则后关闭。
也便是说,KieContainer用于加载和管理规则文件,而KieSession则供应了规则的实行环境,用于插入事实并实行规则。通过这两个工具的合营利用,我们可以实现规则的加载、管理和实行。
java
复制代码
@Service @Slf4j public class DroolsService { @Autowired private KieContainer kieContainer; / 规则中须要利用的SpringBean / @Autowired private DroolsTestService droolsTestService; / 该方法用于将给定的Person工具运用到Drools规则中,并触发规则的实行。 @param person / public void applyRules(Person person) { // 创建一个KieSession KieSession kieSession = kieContainer.newKieSession(); try { // 通过设置全局变量到规则文件中去 kieSession.setGlobal("myService", droolsTestService); // 添加规则运行时势宜监听器,用于调试 kieSession.addEventListener(new DebugRuleRuntimeEventListener()); kieSession.addEventListener(new DebugAgendaEventListener()); // 将变量插入到规则中 kieSession.insert(person); // 触发规则 kieSession.fireAllRules(); } catch (Exception e) { log.error("applyRules error", e); } finally { kieSession.dispose(); } } }
步骤5: 验证一下规则利用利用到的Service 代码
java
复制代码
@Service @Slf4j public class DroolsTestService { public void youngerThan18(Person person) { person.setName(person.getName() + "<----> youngerThan18"); } public void elderThan18(Person person) { person.setName(person.getName() + "<----> elderThan18"); } }
触发利用的controller
java
复制代码
@RestController @RequestMapping(value = "/ruleEngine") public class RuleEngineController { @Autowired private DroolsService droolsService; @PostMapping("/test") public Person test(@RequestBody Person person) { droolsService.applyRules(person); return person; } }
可以通过日志判断规则的实行情形,可以看到规则是命中了adult规则,并且也实行到了我们的Service中。 Adult规则测试:
Teenager规则测试: