基于Drools规则引擎通过apollo实现动态更新_springboot + 基于drools规则引擎通过apollo实现动态更新-程序员宅基地

技术标签: jdk8  drools  apollo  动态发布  

目录

Drools 规则引擎简介

Drools 规则引擎原理

Talk is cheap. Show me the code


Drools 规则引擎简介

        Drools 具有一个易于访问企业策略、易于调整以及易于管理的开源业务 规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验已编码的规则是否执行了所需的业务规则。其前身是 Codehaus 的一个开源项目叫 Drools,最近被纳入 JBoss 门下,更名为 JBoss Rules,成为了 JBoss 应用服务器的规则引擎。

        Drools 被分为两个主要的部分:编译和运行时。编译是将规则描述文件按 ANTLR 3 语法进行解析,对语法进行正确性的检查,然后产生一种中间结构“descr”,descr 用 AST 来描述规则。目前,Drools 支持四种规则描述文件,分别是:drl 文件、 xls 文件、brl 文件和 dsl 文件,其中,常用的描述文件是 drl 文件和 xls 文件,而 xls 文件更易于维护,更直观,更为被业务人员所理解。运行时是将 AST传到 PackageBuilder,由 PackagBuilder来产生 RuleBase,它包含了一个或多个 Package 对象。

        Drools 的语法规则将在实践中介绍,下面分析 drools 的原理。

Drools 规则引擎原理

Drools 中的 Rete 算法被称为 ReteOO,表示 Drools 为面向对象系统(Object Oriented systems)增强并优化了 Rete 算法。

在 Drools 中,规则被存 放在 Production Memory(规则库)中,推理机要匹配的 facts(事实)被存在 Working Memory(工作内存)中。当时事实被插入到工作内存中后,规则引擎会把事实和规则库里的模式进行匹配,对于匹配成功的规则再由 Agenda 负责具体执行推理算法中被激发规则的结论部分,同时 Agenda 通过冲突决策策略管理这些冲突规则的执行顺序,Drools 中规则冲突决策策略有:

  1. 优先级策略
  2. 复杂度优先策略
  3. 简单性优先策略
  4. 广度策略
  5. 深度策略
  6. 装载序号策略
  7. 随机策略 [5][6]。

 Drools 的原理示意图

图 4. Drools 的原理示意图

Talk is cheap. Show me the code

定义简单规则:

package com.aeert.droolsdemo.fact;
dialect  "mvel"

rule "person"
    when
        $person : Person(age<11 || age>50)
    then
        System.out.println("这个人的年龄不符合要求!");
end

通过apollo修改规则后:

实现效果:

耗时:16
耗时:0
耗时:0
耗时:0
2020-03-27 17:11:49.348  INFO 5357 --- [Apollo-Config-1] com.aeert.SessionFactory                 : 规则 rules.age 发生变更: package com.aeert.droolsdemo.fact;
dialect  "mvel"

rule "person"
    when
        $person : Person(age<11 || age>50)
    then
        System.out.println("这个人的年龄不符合要求!");
end -> package com.aeert.droolsdemo.fact;
dialect  "mvel"

rule "person"
    when
        $person : Person(age<16 || age>50)
    then
        System.out.println("这个人的年龄不符合要求!");
end .
2020-03-27 17:11:49.352  WARN 5357 --- [Apollo-Config-1] o.d.c.kie.builder.impl.KieBuilderImpl    : File 'file0.drl' is in folder '' but declares package 'com.aeert.droolsdemo.fact'. It is advised to have a correspondance between package and folder names.
这个人的年龄不符合要求!
耗时:36
这个人的年龄不符合要求!
耗时:0
这个人的年龄不符合要求!
耗时:1
这个人的年龄不符合要求!
耗时:1
2020-03-27 17:12:08.514  INFO 5357 --- [Apollo-Config-1] com.aeert.SessionFactory                 : 规则 rules.age 发生变更: package com.aeert.droolsdemo.fact;
dialect  "mvel"

rule "person"
    when
        $person : Person(age<16 || age>50)
    then
        System.out.println("这个人的年龄不符合要求!");
end -> package com.aeert.droolsdemo.fact;
dialect  "mvel"

rule "person"
    when
        $person : Person(age<11 || age>50)
    then
        System.out.println("这个人的年龄不符合要求!");
end .
2020-03-27 17:12:08.519  WARN 5357 --- [Apollo-Config-1] o.d.c.kie.builder.impl.KieBuilderImpl    : File 'file0.drl' is in folder '' but declares package 'com.aeert.droolsdemo.fact'. It is advised to have a correspondance between package and folder names.
耗时:2
耗时:1
Disconnected from the target VM, address: '127.0.0.1:62266', transport: 'socket'
2020-03-27 17:12:19.807  INFO 5357 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

Process finished with exit code 130 (interrupted by signal 2: SIGINT)

测试代码:

    @Test
    void contextLoads() throws InterruptedException {
        for (int i = 0; i < 50; i++) {
            Long start = System.currentTimeMillis();
            KieSession ksession = null;
            try {
                ksession = sessionFactory.getSession("rulesAge");

                Person person = new Person();
                person.setName("蔡徐坤");
                person.setAge(12);
                ksession.insert(person);

                ksession.fireAllRules(1);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
//                ksession.dispose();
            }
            System.out.println("耗时:" + (System.currentTimeMillis() - start));
            Thread.sleep(5000);
        }

    }

pom:

        <dependency>
            <groupId>com.aeert</groupId>
            <artifactId>drools-apollo</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
ImportConfig:
@Configuration
@Import({SessionFactory.class})
public class ImportConfig {

}

apollo:

其中nameSpace(指定apollonameSpace)默认rules, start(匹配规则头,防止非drools规则初始化异常)默认rules

如下:

示例代码地址:下载

关注公众号《小马JAVA》

回复  drools 即可获取项目源码

回复  drools视频 即可获取drools视频教程

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kuangni5808/article/details/105145665

智能推荐

支付宝小程序中点击图片进行放大查看切可以左右滑动_支付宝小程序 查看大图-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏6次。在axml文件中写入代码&amp;lt;view class=&quot;campus-img&quot;&amp;gt; &amp;lt;block a:for=&quot;{{imgarr}}&quot;&amp;gt; &amp;lt;image src=&quot;{{item}}&quot; mode=&quot;scaleToFill&quot; onTap=&quot;img_支付宝小程序 查看大图

Msyqldump和Xtrabackup全备与增量备份mysql数据库-程序员宅基地

文章浏览阅读135次。Msyqldump和Xtrabackup全备与增量备份mysql数据库1、概述:数据备份的介绍,类型,及具;msyqldump备份的实现和数据恢复;(4GB)Xtrabackup备份的实现和数据恢复;(百G)备份和恢复(数据):2、介绍★备份:存储的数据副本;原始数据:持续改变;(考虑问题)★恢复:把副本应到线上系统;仅能恢复备份操作时刻的数据状态;★时间点恢复:bin-l..._mysqldump跟xtrabackup进行增量备份

AXI GPIO中断_axi设备有中断端口吗?-程序员宅基地

文章浏览阅读874次。代码_axi设备有中断端口吗?

Linux环境下,文件的压缩/解压_linux 压缩文件-程序员宅基地

文章浏览阅读7.7w次,点赞56次,收藏272次。一、zip格式 zip可能是目前使用的最多的文档压缩格式。优点:可以在不同的操作系统平台上使用。缺点:支持的压缩率不是很高。而tar.gz和tar.bz2在压缩率方面做得非常好。压缩一个zip文件(命令): zip-r newfilename.zip filename (-r是压缩文件,newfilename.zip是指压缩之后的文件名称,filename是指要压缩的..._linux 压缩文件

二叉树、树和有序树的区别_有序树和二叉树的区别-程序员宅基地

文章浏览阅读2.7w次,点赞12次,收藏22次。树:子树没有左右之分二叉树、有序树:左右有序二叉树与有序树:在只有一棵树的情况下,二叉树有左右之分、有序树无左右之分另外:二叉树是有序的,可以为空或一个根节点以及两个分别称为左子树和右子树的互不相交的二叉树组成。_有序树和二叉树的区别

android design安装教程,android design-程序员宅基地

文章浏览阅读335次。android design materialchange text appearanceandroid:textAppearance="?android:textAppearanceMediumandroid:background="#2196F3"android开发网站layouttextView中的layout_width其实是viewGroup的属性,用来进行大小设定位置设定。而textV..._design android

随便推点

app拍照添加水印 (uniapp)_uniapp照片水印-程序员宅基地

文章浏览阅读299次。注意这里的代码是拍照的,拍照uniapp返回的路径是 _doc/uniapp_temp_1678758693371/camera/1678758699703.jpg 这种格式的路径,无法直接使用 img 标签展示,但是如果不用img标签展示,使用image,生成出来的图片会非常的模糊,因为image他打包后是被当做 背景图片渲染的,而不是当做图片。html2canvas是无法直接在app中使用的,但是uniapp提供了renderjs,所以我们还是能在uniapp中使用html2canvas的。_uniapp照片水印

python创建路径指定文件,并创建日志log文件_python创建log文件-程序员宅基地

文章浏览阅读1.8k次。python主动创建路径文件并创建日志log文件,可以显示时间信息(get_timestamp()),不需要可以去掉。_python创建log文件

PAT_Advanced Level_1022 Digital Library(C++_STL)_pat advanced level 1022-程序员宅基地

文章浏览阅读150次。A Digital Library contains millions of books, stored according to their titles, authors, key words of their abstracts, publishers, and published years. Each book is assigned an unique 7-digit number a..._pat advanced level 1022

Java环境--jdk安装_安装java环境jdk-程序员宅基地

文章浏览阅读224次。jdk安装第一步:访问官网 : 官网下载最新版本jdk_安装java环境jdk

mybatis使用注解的方式实现批量增加_@insertprovider遍历数组添加-程序员宅基地

文章浏览阅读799次。文章目录注:在学习的过程中记录@Insert和@InsertProvider @Insert实现 @InsetProvider实现实体类pojo@Data@Table(name = "easy_excel")public class DemoData { @Id private String name; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date time..._@insertprovider遍历数组添加

Intellij IDEA Tomcat设置CLASSPATH 不生效 配置分离实现_idea 中classpath为空-程序员宅基地

文章浏览阅读6k次。在开发JavaWeb应用时,为了实现配置分离,我们有时候需要在CLASSPATH中设置的配置文件的路径。但是在使用Intellij idea时发现发现设置的CLASSPATH不生效。尝试过的方法:1.在intellij idea 项目中的module中添加2.在Windows --我的电脑--属性--高级系统变量里设置CLASSPATH都没有效果!找了许久的原因,偶然发现原来创建Tomcat se..._idea 中classpath为空