SpringBoot整合 drools规则引擎 系列教程(二)Drools规则语法 & LHS 条件java
教程代码已提交到ytooo-drools,欢迎stargit
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,
实现了将业务决策从应用程序代码中分离出来,并使用预约义的语义模块编写业务决策。
接受数据输入,解释业务规则,并根据业务规则作出业务决策。github
简单来讲包括像表单验证和动态表达式引擎这样的简单系统均可以称之为规则引擎。web
复杂企业级项目的开发以及其中随外部条件不断变化的业务规则(business logic),
迫切须要分离商业决策者的商业决策逻辑和应用开发者的技术决策,
并把这些商业决策放在中心数据库或其余统一的地方,让它们能在运行时(即商务时间)
能够动态地管理和修改从而提供软件系统的柔性和适应性。规则引擎正是应用于上述动态环境中的一种解决方法。算法
企业管理者对企业级IT系统的开发有着以下的要求:
为提升效率,管理流程必须自动化,即便现代商业规则异常复杂;
市场要求业务规则常常变化,IT系统必须依据业务规则的变化快速、低成本的更新;
为了快速、低成本的更新,业务人员应能直接管理IT系统中的规则,不须要程序开发人员参与。spring
使用了规则引擎以后,许多涉及业务逻辑的程序代码基本被这五个典型步骤数据库
Drools 是用 Java 语言编写的具备一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎
,其基于CHARLES FORGY'S的RETE算法
符合业内标准,速度快且效率高。 业务分析师人员或审核人员能够利用它轻松查看业务规则,
检验已编码的规则执行了所需的业务规则。编程
<properties> <java.version>1.8</java.version> <drools.version>7.14.0.Final</drools.version> </properties> <dependencies> <!-- drools依赖 --> <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>${drools.version}</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>${drools.version}</version> </dependency> <!-- 决策表 --> <dependency> <groupId>org.drools</groupId> <artifactId>drools-decisiontables</artifactId> <version>${drools.version}</version> </dependency> <!-- 模板 --> <dependency> <groupId>org.drools</groupId> <artifactId>drools-templates</artifactId> <version>${drools.version}</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> <version>${drools.version}</version> </dependency> </dependencies>
@Configuration public class KiaSessionConfig { @Bean public KieSession getSession() { KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); return kContainer.newKieSession("ksession-rules"); } }
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"> <kbase name="rules" packages="rules"> <ksession name="ksession-rules"/> </kbase> </kmodule>
package com.ytooo.bean import com.ytooo.bean.People dialect "java" rule "man" when $p : People(sex == 1 && drlType == "people") then System.out.println($p.getName() + "是男孩"); end
package com.ytooo.bean import com.ytooo.bean.People dialect "java" rule "girl" when $p : People(sex == 0 && drlType == "people") then System.out.println($p.getName() + "是女孩"); end
drools中,规则是使用对象来匹配规则的,如上面两个规则文件,在java中执行People对象的规则时,两种规则都会触发segmentfault
package com.ytooo.bean; import lombok.Data; /** * Created by Youdmeng on 2020/1/7 0007. */ @Data public class People { private int sex; private String name; private String drlType; public People(int sex, String name, String drlType) { this.sex = sex; this.name = name; this.drlType = drlType; } public People() { } }
package com.ytooo; import com.ytooo.bean.People; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.kie.api.runtime.KieSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @SpringBootTest @RunWith(SpringRunner.class) class DroolsApplicationTests { @Autowired private KieSession session; @Test public void people() { People people = new People(); people.setName("达"); people.setSex(1); people.setDrlType("people"); session.insert(people);//插入 session.fireAllRules();//执行规则 } @AfterEach public void runDispose() { session.dispose();//释放资源 } }
达是男孩
达是女孩
package com.ytooo.bean; import lombok.Data; /** * Created by Youdmeng on 2020/1/7 0007. */ @Data public class Cat { private int sex; private String name; }
@Test public void cat() { Cat cat = new Cat(); cat.setName("金"); cat.setSex(1); session.insert(cat);//插入 session.fireAllRules();//执行规则 }
传入sex为1或0,都没有结果输出api
相同.drl文件中能够继承多组规则如:
package com.ytooo.bean import com.ytooo.bean.People dialect "java" rule "man" when $p : People(sex == 1 && drlType == "people") then System.out.println($p.getName() + "是男孩"); end rule "cat" when $c : Cat(sex == 1 && $c.getName().equals("金")) then System.out.println($c.getName() + "是公的"); end
教程代码已提交到ytooo-drools,欢迎star