基于Drools规则引擎通过apollo实现动态更新_drools apollo_JAVA拾贝的博客-程序员资料

技术标签: 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

智能推荐

STM32学习笔记 | 片内FLASH读写失败问题分析_strongerHuang的博客-程序员资料

关注+星标公众号,不错过精彩内容FLASH,指Flash Memory,是一种非易失性存储器(闪存),掉电能正常保存数据。STM32的存储器通常包含内部SRAM、内部FLASH,部分系列还...

MySQL 5.1参考手册学习笔记 第1章:一般信息_zhujiaxing666666的博客-程序员资料

1.2. 本手册采用的惯例本手册采用了特定的印刷惯例:·         这类风格的文本用于SQL语句,数据库、表和列名称,C和Perl代码,以及环境变量。例如: 要想重新加载授权表,请使用FLUSH PRIVILEGES语句。这类风格的文本用于指明键入的数如信息。·         这类风格的文本用于指明可执行程序和脚本的名称,例如mysql(My

Linux下的性能调优工具Oprofile VS perf,从Oprofile转向使用perf_oprofile perf_阿拉丁神灯_的博客-程序员资料

好文,学习一下。原文链接:https://developer.ibm.com/tutorials/migrate-from-oprofile-to-perf/原标题:Migrating from OProfile to perf, and beyondMap your favorite OProfile commands to their equivalent perf com...

系统无法打开.exe可执行文件的解决方案_weixin_34279184的博客-程序员资料

电脑出现在如题所说的问题,点击我的电脑的属性弹出一个对话框说“无法找到C:\WINDOWS\system32\rundll32.exe”,后来想打开一些已经安装的软件程序却弹出一个要你选择打开方式的对话框,后来发现杀毒软件也不见了,更令我吃惊的是居然无法安装文件!怎么办呢?   解决方法:对于exe打开方式被***或病毒修改,无法打开任何可执行文件的解决办法。   方...

Java Collections singletonList()方法及示例_0xadf7Dc19D52eD986A的博客-程序员资料

集合类singletonList()方法 (Collections Class singletonList() method)singletonList() method is available in java.util package.singletonList()方法在java.util包中可用。singletonList() method is used to return an immutable list [i.e. immutable List is a list that c...

iPhone12、iPhone12 Pro、iPhone12 Max、iPhone12 Pro Max 开卖时间_苹果q12 pro max什么时候开售_m0_50613577的博客-程序员资料

iPhone12系列手机要推迟发布了,现在有多方报道称苹果iPhone12系列手机会在10月份的时候发布。iphone11 爆降2000 太给力了 https://www.apple.com.cniPhone 12系列仍采用刘海屏+“浴霸”镜头的设计,但因为这些小细节的变动,美出了新高度。而且,配合iPhone 12 5.4英寸的小屏幕,显得十分小巧精致,有望成为小屏党最受追捧的机型。iPhone12这次最令人期待的是其搭载的A14仿生芯片,其采用了5纳米的制程,核心性能比起上一代A13仿生芯片提升

随便推点

使用mysql的Concat链接数据_lcathm的博客-程序员资料

mysql -h10.xxx -uook -pdbbbH9DePOxb -P3306 -Ne "use nb_sdk; select CONCAT('UPDATE nb_app p set p.app_id =',p.AppId, ', p.app_key=''',p.AppKey, ''', p.secret_key=''',p.SecretKey, ''', p.notify_url=''',

MYSQL 字符集问题_mysql collation_database 与 collation_server 字符集 不一_cocacola81的博客-程序员资料

前一段时间,一直被mysql的字符集困扰,今天就这方面的知识总结一下.MySQL的字符集支持(Character Set Support)有两个方面:     字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次:      服务器(server),数据库(database),数据表(table)和连接(connection)。1...

C++简单字符串加密(替换)_c++字符替换加密_苦逼的IT男的博客-程序员资料

// ------------------------------------// 功能: C++简单字符串加密(替换)// 作者: 吴道明// 时间: 2016.9.13// ------------------------------------#include<iostream>#include<string>using namespace std;void Encrypt(str

html标签(列表标签和表单标签以及表单控件)-小白学习中_小白学习中–.–的博客-程序员资料

html-614.列表标签14.1无序列表&lt;ul&gt; &lt;li&gt;列表项1&lt;/li&gt; &lt;li&gt;列表项2&lt;/li&gt; &lt;li&gt;列表项3&lt;/li&gt;&lt;/ul&gt;注: &lt;ul&gt;中只能放&lt;li&gt; &lt;li&gt;中可以放任何元素,相当于一个容器14.2有序列表&lt;ol&gt; &lt;li&gt;列表项1&lt;/li&gt; &lt;li&gt;列表项2&lt;/li&

开发板STM32 三轴联动 带插补 加减速 源代码 MDK 源码_「已注销」的博客-程序员资料

开发板STM32 三轴联动 带插补 加减速 源代码 MDK 源码 分别基于STM32F1和STM32F4两套的三轴联动插补(直线圆弧两种带)加减速的源码,基于国外写的脱机简易雕刻机源码的项目修改,添加了大量的中文注释,可以很好帮助大家学习这个源码。编号:9216668332244797不过一场少年梦。,...

Box2D C++ 教程-碰撞过滤_box2d 碰撞过滤_箭已离弓的博客-程序员资料

声明:本教程翻译自:Box2D C++ tutorials-Collision filtering,仅供学习参考。碰撞过滤(Collision filtering)到目前为止所有场景都是我们自己创建的,场景中的每个定制器(fixture)之间可以互相发生碰撞。这是默认的物理环境,但是可以通过设置’碰撞过滤’(Collision filtering)来控制定制器之间的碰撞状态