python 规则引擎 drools_Drools规则引擎入门指南(一)
最近项目需要增加风控系统,在经过一番调研以后决定使用Drools规则引擎。因为项目是基于SpringCloud的架构,所以此次学习使用了SpringBoot2.0版本结合Drools7.14.0.Final版本。
引入依赖
1
2
3
4
5
6
7
8
9
10
org.drools
drools-core
7.14.0.Final
org.kie
kie-spring
7.14.0.Final
创建配置类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
@Configuration
public class DroolsAutoConfiguration {
private static final String RULES_PATH = "rules/";
@Bean
@ConditionalOnMissingBean(KieFileSystem.class)
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();
return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");
}
@Bean
@ConditionalOnMissingBean(KieContainer.class)
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());
}
@Bean
@ConditionalOnMissingBean(KieBase.class)
public KieBase kieBase() throws IOException {
return kieContainer().getKieBase();
}
@Bean
@ConditionalOnMissingBean(KieSession.class)
public KieSession kieSession() throws IOException {
KieSession kieSession = kieContainer().newKieSession();
return kieSession;
}
@Bean
@ConditionalOnMissingBean(KModuleBeanFactoryPostProcessor.class)
public KModuleBeanFactoryPostProcessor kiePostProcessor() {
return new KModuleBeanFactoryPostProcessor();
}
public KieServices getKieServices() {
System.setProperty("drools.dateformat","yyyy-MM-dd");
return KieServices.Factory.get();
}
}
在这个时候我们的基本环境已经搭建好了,接下来我们一起来学习Drools吧
HelloWord
程序员的世界里,我们学习任何一门语言都是以HelloWord开启的,本次学习也不例外。
1.创建规则文件
Drools的规则文件是以*.drl结尾的文件,我们来看一个最简单的规则文件中都是包含什么。
通常来说,我们会把规则文件放在resources资源文件夹下,这里呢我们在resources文件夹下新建一个rules文件夹,然后再新建一个HelloWord.drl文件
1
2
3
4
5
6
7
8
9
10
11
package rules;
import cn.org.zhixiang.entity.User;
import java.lang.String;
import java.util.List;
rule "hello,word"
when
eval(true)
then
System.err.println("hello,word!");
end
规则文件,就是我们新建的这个HelloWord.drl可以理解为一个Java类
package,这个跟Java中的包名是差不多的
import,此文件中需要的类。
rule,可以理解为给这个规则起的一个名字,一个规则文件中可以包含多个rule。
when,when下面可以放置一些条件判断的表达式以及定义一些变量什么的。如果里面内容为空的话则会默认添加一个eval(true)代表一个为true的表达式
then,当when下面的表达式为true是then下方的代码才会执行,在这里可以直接编写Java代码(代码所需要的类通过import引入),当然也可以使用when模块定义的一些变量
end 代表规则hello,word的结束。
2.Java调用
现在我们的规则文件写好以后就可以在Java中来进行调用了。
1. 新建一个测试类DroolsApplicationHelloWordTests
1
2
3
4
5
6
7
8
@RunWith(SpringRunner.class)
@SpringBootTest
public class DroolsApplicationHelloWordTests {
@Autowired
KieSession kieSession;
}
上方注入的kieSession对象就是以后与Drools打交道最常用的一个对象了,通过它可以直接操作在配置类kieFileSystem方法中加载的所有的规则文件
2. 编写测试代码
1
2
3
4
@Test
public void testHelloWord() {
kieSession.fireAllRules();
}
kieSession.fireAllRules方法是执行所有的规则,在运行了这个测试方法之后我们应该就可以看到控制台打印的一句hello,word!了
基础学习
1. 向规则文件传参
1. 在entity包下新增一个User的实体类
1
2
3
4
5
6
7
8
9
10
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
//省略getter,setter
}
2. 在hello,word规则下方再次新建一个规则user
1
2
3
4
5
6
7
rule "user"
when
$u:User(name=="张三",age==18)
then
$u.setName("李四");
System.err.println("hello,word:"+$u.getName());
end
$u:User(name==“张三”,age==18)的意思就是当存在一个user对象,并且它的name属性等于张三age等于18时就把这个对象赋值给$u。
在下方的then模块,如果上方的条件成立时就把$u的name属性更新一下,然后打印。
3. 编写测试代码
1
2
3
4
5
6
7
@Test
public void testUser() {
User user=new User("张三",18);
kieSession.insert(user);
kieSession.fireAllRules();
System.err.println("规则执行完毕后张三变为了:"+user.getName());
}
我们可以使用kieSession.insert方法向规则文件中传参,然后在调用方法后你会发现在规则文件中更改的值在Java代码中也被更改了。
4. 存在的小问题
可能你会发现上方代码执行的时候连那句helloword也打印了,为什么呢,这是因为HelloWord那条规则没有验证条件再加上kieSession.fireAllRules()本来就是执行所有被加载的规则的。那么避免这种情况的办法就是执定本次执行的规则
1
2
3
4
5
6
@Test
public void testOneRule() {
User user=new User("张三",18);
kieSession.insert(user);
kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("user"));
}
上方的user就是指定的本次执行的规则名称了。
5.扩展操作
上方我们通过RuleNameEndsWithAgendaFilter对象成功指定了需要执行的规则文件,其实通过查看此对象的源码我们发现这个对象是AgendaFilter的一个实现类,决定执不执行一个规则的条件是accept方法返回的boolean值决定的。
所以说如果我们希望可以一次批量匹配多个规则的话可以通过继承AgendaFilter重写accept方法哦
2. 常用运算符
1. 连接符
Drools中存在的三种连接符,上方的代码中我们已经使用过一个了,那就$u:User(name==“张三”,age==18)中的逗号,这里的逗号其实就是and的意思。另外的两个运算符就是&&和||,相信它们两个的意思不用我来介绍了吧。
不过有一点需要注意的是&&和|| 和逗号,不能同时出现。要不你选择用&&和||要不就只用逗号, 。
2. 类型比较操作符
1.首先就是,==,!=,>=,<=这六个
它们是配合eval使用的,比如上方我们使用的eval(true)就是直接返回的true。当我们比较常量时可以使用eval(u.age>b.age)
2. contains not contains
contains用于判断对象的某个字段是否包含另外一个对象
1
2
3
4
5
6
7
rule "contains"
when
$s:String()
$u:User(name contains $s)
then
System.err.println("用户张三存在");
end
1
2
3
4
5
6
7
8
@Test
public void testContains() {
String name="张三";
User user=new User("张三",18);
kieSession.insert(name);
kieSession.insert(user);
kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("contains"));
}
not contains顾明思议就是不包含
3. memberOf not memberOf
memberOf用于判断对象的某个字段是否存在一个集合中
1
2
3
4
5
6
7
rule "memberOf"
when
$list:List()
$u:User(name memberOf $list)
then
System.err.println("用户李四存在");
end
1
2
3
4
5
6
7
8
9
10
@Test
public void testMemberOf() {
List list=new ArrayList();
list.add("张三");
list.add("李四");
User user=new User("李四",18);
kieSession.insert(list);
kieSession.insert(user);
kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("memberOf"));
}
not memberOf顾明思议就是不存在
3. matches not matches
matches就是用于匹配正则表达式的了
1
2
3
4
5
6
rule "matches"
when
$u:User(name matches "张.*")
then
System.err.println("用户张xx存在");
end
1
2
3
4
5
6
@Test
public void testMatches() {
User user=new User("张三",18);
kieSession.insert(user);
kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("matches"));
}
not matches不用我说了吧
python 规则引擎 drools_Drools规则引擎入门指南(一)相关推荐
- python 规则引擎 drools_Drools规则引擎决策表使用场景
决策表是表示条件逻辑的"精确而紧凑"的方式,非常适合商业级别的规则. Drools支持以电子表格格式管理规则.支持的格式为Excel(XLS)和CSV,这意味着可以使用各种电子表格 ...
- python 规则引擎 drools_Drools规则引擎入门demo
简单介绍 互联网旧系统维护中往往存在非常多的规则(比如:age < 16 || age > 50 -> REJECT ).最便捷的实现就是用 if-else 来写,但是随着规则的增加 ...
- python 规则引擎 drools_Drools规则引擎详解-常用的drl实例
关于Drools规则引擎,之前已经写了几篇相关文章,如果大家不熟悉的可以移步了解下: 本篇博客主要为大家列举一些常用,简单的drl文件,帮助大家更加深入地了解其drl文件地编写格式及常用的操作符 说明 ...
- 怎么装python的keras库_Keras教程:用Python进行深度学习的终极入门指南
在这个循序渐进的Keras教程中,你将学习如何在Python中构建卷积神经网络! 事实上,我们将训练一个用于手写数字的分类器,它在著名的MNIST数据集上夸大了99%的准确度. 在开始之前,我们应该注 ...
- python 30分钟_Python 30分钟入门指南
# 用井字符开头的是单行注释 """ 多行字符串用三个引号 包裹,也常被用来做多 行注释 """ ##################### ...
- python规则引擎pyke_规则引擎Pyke与PyClips对比研究报告
1. 背景综述 规则引擎主要实现的功能是存储.分类和管理规则,执行规则.推断其它事实的应用程序.其中的规则主要是指企业或商务业务逻辑.法律条款等.在规则引擎发展的过程中,Rete算法和Prolog语言 ...
- 金山云容器引擎服务入门指南
金山云容器引擎服务入门指南 本入门指南介绍如何利用金山云容器引擎服务快速搭建Kubernetes集群,并部署一个Nginx应用和Kubernetes Dashboard服务的过程. 部署架构参考如下: ...
- mysql 规则引擎_Drools规则引擎详解-常用的drl实例
package droolsDemo //说明:每个 drl 都必须声明一个包名,这个包名与 Java 里面的不同,它不需要与文件夹的层次结构一致, //主要用于可以根据kmodule.xml中不同的 ...
- java 实现规则引擎_Java规则引擎 Easy Rules
1. Easy Rules 概述 Easy Rules是一个Java规则引擎,灵感来自一篇名为<Should I use a Rules Engine?>的文章 规则引擎就是提供一种可选 ...
- 成本计算引擎动态规则解析技术详解
源宝导读:随着企业数字系统应用的越来越深入,业务计算方式也变的越来越复杂,灵活度要求也越来越高.本文将介绍通过将配置动态转换成可执行代码的方式,解决业务计算高度灵活化配置的技术方案. 一.背景 ERP ...
最新文章
- linux qemu 使用方法
- Linux 的多线程编程的高效开发经验
- Android文件系统的结构
- jsp里面编写java代码注意加双引号
- Android RecyclerView (一) 使用完全解析
- python图像对比_用python实现对比两张图片的不同
- 【C/C++开发】C++11 并发指南二(std::thread 详解)
- SAR(遥感、卫星) 图像常用数据集
- c语言中find的作用,c语言find函数的用法详解
- hadoop菜鸟教程 Hadoop学习资料(云计算学习电子书)
- 设计模式面试题(总结最全面的面试题!!!)
- rar压缩包的打开密码破解
- 编程实现恩格玛加密机(C++)
- 使用关键词快速搜索商品代码
- 温故而知新,可以为师矣,学习到的东西不断回顾,往往能够发现自己的不足...
- 东南大学计算机学院学办董烨,东南大学计算机教学实验中心(国家级)
- Vue 正确理解mounted、beforeUpdate、updated三个钩子函数的关系
- 江苏学计算机软件哪个专科大学好,江苏 我学软件技术可以报考哪些学校
- 真正的IT技术男是什么样的
- 利用matlab做一个不定二重积分的计算
热门文章
- springboot集成ureport2
- w7系统怎么ping服务器,win7系统中如何ping端口命令
- 微信支付 签名错误 uniapp
- tomcat里面的war包解压后没有访问权限
- 360 n5 com.android.sc,360N5官方稳定版刷机包(最新系统刷机固件升级包V3.0稳定版)...
- 日常搜集的勒索病毒解密工具的汇总
- java多线程 —— 面试题集合(最全集合)
- 引起1月12日WIN10 Flash停用原因
- uc android 4.2,uc网盘下载10.4.2 安卓版-uc网盘手机版西西软件下载
- 铁路智能巡检机器人——铁路上的“医生”