Drools规则引擎
项目Github地址
如果使用硬编码来实现业务规则的话,不容易维护,不容易应对变化,改变的话需要重启服务器才能生效.
规则引擎实现了将业务决策从应用程序代码中分离出来,接收数据输入,解释业务规则,并根据业务规则做出业务决策。
规则引擎有三部分构成
- Working Memory(工作内存)
- Rule Base(规则库)
- Inference Engine(推理引擎)
(file-settings-plugins)加入插件对JBoss Drools的支持
入门案例
添加需要的jar包坐标
<!-- https://mvnrepository.com/artifact/org.drools/drools-compiler -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.23.0.Final</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>6.5.0.Final</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>7.23.0.Final</version>
</dependency>
加入drools规则引擎的配置文件
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.builder.KieRepository;
import org.kie.api.builder.ReleaseId;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.io.Resource;
import java.io.IOException;
@Configuration
public class KiaSessionConfig {
private static final String RULES_PATH = "rules/";
@Bean
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
for (Resource file : getRuleFiles()) {
kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8"));
}
return kieFileSystem;
}
private Resource[] getRuleFiles() throws IOException {
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
final Resource[] resources = resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");
return resources;
}
@Bean
public KieContainer kieContainer() throws IOException {
final KieRepository kieRepository = getKieServices().getRepository();
kieRepository.addKieModule(new KieModule() {
public ReleaseId getReleaseId() {
return kieRepository.getDefaultReleaseId();
}
});
KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());
kieBuilder.buildAll();
return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}
private KieServices getKieServices() {
return KieServices.Factory.get();
}
@Bean
public KieBase kieBase() throws IOException {
return kieContainer().getKieBase();
}
@Bean
public KieSession kieSession() throws IOException {
return kieContainer().newKieSession();
}
}
POJO
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private int age;
}
- 在resources资源下创建rules文件夹,存放规则文件*.drl
编写规则文件
匹配person年龄小于18岁的
package rules
import com.drools.pojo.Person
import javafx.beans.binding.When
rule "Person"
when
$person : Person(age < 18)
then
System.out.println($person.getUserName()+"年龄不到成年条件");
end
测试
@Resource
private PersonMapper personMapper;
@Resource
private KieSession kieSession;
@Test
void testFindByAge() {
List<Person> people = personMapper.selectAll();
for (Person person : people) {
// 将数据提供给规则引擎,进行匹配
kieSession.insert(people);
}
// 激活规则引擎
kieSession.fireAllRules();
// 关闭会话
kieSession.dispose();
}
查看结果,找出了数据中符合规则的数据
Drools基础语法
规则文件构成 *.drl
关键字 | 描述 |
---|---|
package | 包名,只限于逻辑上的管理,同一个包名下的查询或者函数可以直接调用 |
import | 用于导入类或者静态方法 |
global | 全局变量 |
function | 自定义函数 |
query | 查询 |
rule end | 规则体 |
规则体语法结构
Pattern模式匹配: 结构: 绑定变量名:Object(Field约束)
绑定的变量名可以在RHS规则结果使用(对象,变量)
Drools提供的比较操作符
执行指定规则
new RuleNameEqualsAgendaFilter(“规则名称”)
Drools内置方法
- update
- insert
- retract 删除工作内存中的数据,并让相关的规则重新匹配。
规则格式
rule "ruleName"
attributes
when
LHS
then
RHS
end
attributes属性
enabled 测试
1.global全局变量
2. query查询
query 查询的名称(可选参数)
LHS
end
带参,不带参
** function函数**
- 结构
function 返回值类型 函数名(可选参数){
//逻辑代码
}
成功触发了自定义的函数
LHS
- 复合值in/not in
$person : Person(userName in (“张三”,“李四”,“王五”)) - 条件元素eval,返回一个Boolean值
eval(1 == 1) - not 判断是否存在某个Fact对象,不存在返回true
not Person() - exists 判断是否存在某个Fact对象,存在返回true
exists Person() - 规则继承extends
RHS
- halt() 立即终止后面所有规则的执行
- getWorkingMemory返回工作内存对象。
- getRule() 返回规则对象。