最近项目需要增加风控系统,在经过一番调研以后决定使用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规则引擎入门指南(一)相关推荐

  1. python 规则引擎 drools_Drools规则引擎决策表使用场景

    决策表是表示条件逻辑的"精确而紧凑"的方式,非常适合商业级别的规则. Drools支持以电子表格格式管理规则.支持的格式为Excel(XLS)和CSV,这意味着可以使用各种电子表格 ...

  2. python 规则引擎 drools_Drools规则引擎入门demo

    简单介绍 互联网旧系统维护中往往存在非常多的规则(比如:age < 16 || age > 50 -> REJECT ).最便捷的实现就是用 if-else 来写,但是随着规则的增加 ...

  3. python 规则引擎 drools_Drools规则引擎详解-常用的drl实例

    关于Drools规则引擎,之前已经写了几篇相关文章,如果大家不熟悉的可以移步了解下: 本篇博客主要为大家列举一些常用,简单的drl文件,帮助大家更加深入地了解其drl文件地编写格式及常用的操作符 说明 ...

  4. 怎么装python的keras库_Keras教程:用Python进行深度学习的终极入门指南

    在这个循序渐进的Keras教程中,你将学习如何在Python中构建卷积神经网络! 事实上,我们将训练一个用于手写数字的分类器,它在著名的MNIST数据集上夸大了99%的准确度. 在开始之前,我们应该注 ...

  5. python 30分钟_Python 30分钟入门指南

    # 用井字符开头的是单行注释 """ 多行字符串用三个引号 包裹,也常被用来做多 行注释 """ ##################### ...

  6. python规则引擎pyke_规则引擎Pyke与PyClips对比研究报告

    1. 背景综述 规则引擎主要实现的功能是存储.分类和管理规则,执行规则.推断其它事实的应用程序.其中的规则主要是指企业或商务业务逻辑.法律条款等.在规则引擎发展的过程中,Rete算法和Prolog语言 ...

  7. 金山云容器引擎服务入门指南

    金山云容器引擎服务入门指南 本入门指南介绍如何利用金山云容器引擎服务快速搭建Kubernetes集群,并部署一个Nginx应用和Kubernetes Dashboard服务的过程. 部署架构参考如下: ...

  8. mysql 规则引擎_Drools规则引擎详解-常用的drl实例

    package droolsDemo //说明:每个 drl 都必须声明一个包名,这个包名与 Java 里面的不同,它不需要与文件夹的层次结构一致, //主要用于可以根据kmodule.xml中不同的 ...

  9. java 实现规则引擎_Java规则引擎 Easy Rules

    1.  Easy Rules 概述 Easy Rules是一个Java规则引擎,灵感来自一篇名为<Should I use a Rules Engine?>的文章 规则引擎就是提供一种可选 ...

  10. 成本计算引擎动态规则解析技术详解

    源宝导读:随着企业数字系统应用的越来越深入,业务计算方式也变的越来越复杂,灵活度要求也越来越高.本文将介绍通过将配置动态转换成可执行代码的方式,解决业务计算高度灵活化配置的技术方案. 一.背景 ERP ...

最新文章

  1. linux qemu 使用方法
  2. Linux 的多线程编程的高效开发经验
  3. Android文件系统的结构
  4. jsp里面编写java代码注意加双引号
  5. Android RecyclerView (一) 使用完全解析
  6. python图像对比_用python实现对比两张图片的不同
  7. 【C/C++开发】C++11 并发指南二(std::thread 详解)
  8. SAR(遥感、卫星) 图像常用数据集
  9. c语言中find的作用,c语言find函数的用法详解
  10. hadoop菜鸟教程 Hadoop学习资料(云计算学习电子书)
  11. 设计模式面试题(总结最全面的面试题!!!)
  12. rar压缩包的打开密码破解
  13. 编程实现恩格玛加密机(C++)
  14. 使用关键词快速搜索商品代码
  15. 温故而知新,可以为师矣,学习到的东西不断回顾,往往能够发现自己的不足...
  16. 东南大学计算机学院学办董烨,东南大学计算机教学实验中心(国家级)
  17. Vue 正确理解mounted、beforeUpdate、updated三个钩子函数的关系
  18. 江苏学计算机软件哪个专科大学好,江苏 我学软件技术可以报考哪些学校
  19. 真正的IT技术男是什么样的
  20. 利用matlab做一个不定二重积分的计算

热门文章

  1. springboot集成ureport2
  2. w7系统怎么ping服务器,win7系统中如何ping端口命令
  3. 微信支付 签名错误 uniapp
  4. tomcat里面的war包解压后没有访问权限
  5. 360 n5 com.android.sc,360N5官方稳定版刷机包(最新系统刷机固件升级包V3.0稳定版)...
  6. 日常搜集的勒索病毒解密工具的汇总
  7. java多线程 —— 面试题集合(最全集合)
  8. 引起1月12日WIN10 Flash停用原因
  9. uc android 4.2,uc网盘下载10.4.2 安卓版-uc网盘手机版西西软件下载
  10. 铁路智能巡检机器人——铁路上的“医生”