Doorls

Drools规则引擎 Drools(Drools Rule Engine)是一个开源的规则引擎,它主要用于在Java应用程序中实现规则管理。Drools规则引擎将规则定义和管理从应用程序代码中分离出来,使得规则可以独立于应用程序运行。这样可以提高规则的可靠性和可维护性,同时也可以使得规则的更新和管理更加方便。将规则定义和管理从应用程序代码中分离出来,使得规则可以独立于应用程序运行。提供基于规则的访问和操作数据的功能,例如过滤、排序、检索等。支持动态规则扩展和维护,可以根据需要添加、删除或修改规则。 阅读详情

参考 https://www.yiibai.com/drools/drools_eclipse_plugin.html#article-start https://www.cnblogs.com/yjmyzz/p/drools-tutorial.html http://www.ityouknow.com/drools/2017/08/07/drools-started.html

规则引擎

规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。

java开源的规则引擎有:Drools、Easy Rules、Mandarax、IBM ILOG。使用最为广泛并且开源的是Drools。

Drools

Drools 是一个基于Charles Forgy’s的RETE算法的,易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。 业务分析师人员或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。

Drools 是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。Drools允许使用声明方式表达业务逻辑。可以使用非XML的本地语言编写规则,从而便于学习和理解。并且,还可以将Java代码直接嵌入到规则文件中,这令Drools的学习更加吸引人。
rate算法参考:https://developer.ibm.com/zh/articles/os-drools/

  • Drools相关概念:
    事实(Fact):对象之间及对象属性之间的关系
    规则(rule):是由条件和结论构成的推理语句,一般表示为if…Then。一个规则的if部分称为LHS,then部分称为RHS。
    模式(module):就是指IF语句的条件。这里IF条件可能是有几个更小的条件组成的大条件。模式就是指的不能在继续分割下去的最小的原子条件。

环境部署

下面是安装Drools插件的先决条件:

如何运行

规则引擎就是避免每次手动修改if else的逻辑分支,通过规则引擎吧UI展示与代码解耦。
解耦后通过规则文件描述符合什么条件的时候,应该去做什么事情;每当规则有变动的时候,只需要修改规则文件,然后重新加载即可生效。

规则文件--drl

drools有专门的规则语法drl,就是专门描述活动的规则是如何执行的

package rules

import com.neo.drools.entity.Order

rule "zero"
    no-loop true
    lock-on-active true
    salience 1
    when
        $s : Order(amout <= 100)
    then
        $s.setScore(0);
        update($s);
end

rule "add100"
    no-loop true
    lock-on-active true
    salience 1
    when
        $s : Order(amout > 100 && amout <= 500)
    then
        $s.setScore(100);
        update($s);
end

rule "add500"
    no-loop true
    lock-on-active true
    salience 1
    when
        $s : Order(amout > 500 && amout <= 1000)
    then
        $s.setScore(500);
        update($s);
end

rule "add1000"
    no-loop true
    lock-on-active true
    salience 1
    when
        $s : Order(amout > 1000)
    then
        $s.setScore(1000);
        update($s);
end

关键词规则

  • package 与Java语言类似,drl的头部需要有package和import的声明,package不必和物理路径一致。
  • import 导出java Bean的完整路径,也可以将Java静态方法导入调用。
    要应用规则的任何fact,这些fact都需要导入。例如,com.sample.DroolsTest.Message; 在上面的例子。
  • rule 规则名称,需要保持唯一 件,可以无限次执行。
  • no-loop 定义当前的规则是否不允许多次循环执行,默认是 false,也就是当前的规则只要满足条件,可以无限次执行。
  • lock-on-active 将lock-on-active属性的值设置为true,可避免因某些Fact对象被修改而使已经执行过的规则再次被激活执行。
  • salience 用来设置规则执行的优先级,salience 属性的值是一个数字,数字越大执行优先级越高, 同时它的值可以是一个负数。默认情况下,规则的 salience 默认值为 0。如果不设置规则的 salience 属性,那么执行顺序是随机的。
  • when 条件语句,就是当到达什么条件的时候
  • then 根据条件的结果,来执行什么动作
  • end 规则结束

语法

全局调度--配置文件kmodule.xml

这里需要有一个配置文件告诉代码规则文件drl在哪里,在drools中这个文件就是kmodule.xml,放置到resources/META-INF目录下。
kmodule.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://www.drools.org/xsd/kmodule">

    <kbase name="point-rulesKB" packages="rules">
        <ksession name="point-rulesKS"/>
    </kbase>

</kmodule>

对配置文件进行说明:

  • Kmodule 中可以包含一个到多个 kbase,分别对应 drl 的规则文件。
  • Kbase 需要一个唯一的 name,可以取任意字符串。
  • packages 为drl文件所在resource目录下的路径。注意区分drl文件中的package与此处的package不一定相同。多个包用逗号分隔。默认情况下会扫描 resources目录下所有(包含子目录)规则文件。
  • kbase的default属性,标示当前KieBase是不是默认的,如果是默认的则不用名称 就可以查找到该 KieBase,但每个 module 最多只能有一个默认 KieBase。
  • kbase 下面可以有一个或多个 ksession,ksession 的 name 属性必须设置,且必须唯一。

前端处理

代码如下

public static final void main(final String[] args) throws Exception{
    KieServices ks = KieServices.Factory.get();
    KieContainer kc = ks.getKieClasspathContainer();
    execute( kc );
}

public static void execute( KieContainer kc ) throws Exception{
    KieSession ksession = kc.newKieSession("point-rulesKS");
    List<Order> orderList = getInitData();
    for (int i = 0; i < orderList.size(); i++) {
        Order o = orderList.get(i);
        ksession.insert(o);
        ksession.fireAllRules();
        addScore(o);
    }
    ksession.dispose();
}

代码解释:首先通过请求获取 KieServices,通过KieServices获取KieContainer,KieContainer加载规则文件并获取KieSession,KieSession来执行规则引擎,KieSession是一个轻量级组建,每次执行完销毁。KieContainer是重量级组建可以考虑复用。

应用拓展

excel生成规则


下面来解释一下每一行都什么意思
表示规则属于哪个包下的,类似于java中的 package
规则在处理逻辑时用到的类,多个的话,在后面用逗号隔开
一些共用方法可以通过 Functions 来定义,跟java中的方法差不多,就是把 public 换成了 function
空行,必须要有的
给这个excel里的规则定义一个名字,方便别人查看
从这一行开始下面就是规则的部分了,这一行相当于表头,标注了每一列都是什么意思,固定写法,其中 CONDITION 可以有多个
这一行是初始化对象的
指定条件以及输出的处理方式
这一行开始就是真实的业务逻辑了,CONDITION 下的是条件,ACTION 下的是结果,我这给这一行也定成了表头并起了相应的名字,如果不想定表头的话,这一行要为空行
第一列是规则名,第二列是条件,第三列是结果

读取Excel生成规则文件

//把excel翻译成drl文件
@Test
public void test2() {
    SpreadsheetCompiler compiler = new SpreadsheetCompiler();
    // 最后一个参数是excel里 sheet 的名称
    String rules = compiler.compile(ResourceFactory.newClassPathResource("rules" + File.separator + "rule.xlsx", "UTF-8"), "Sheet1");

    try {
        BufferedWriter out = new BufferedWriter(new FileWriter("src/main/resources/rules/test-rule-excel.drl"));
        out.write(rules);
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

上面excel里的规则生成的文件内容如下

package com.example.demo;
//generated from Decision Table
import com.example.drools.Demo;
function int count(Demo $demo) {
    return $demo.getA() + $demo.getB() + $demo.getC();
}
// rule values at A10, header at A5
rule "条件计算1"
    when
        $demo:Demo(a>3,b>4)
    then
        $demo.setTotal(count($demo));
end

// rule values at A11, header at A5
rule "条件计算2"
    when
        $demo:Demo(c<3)
    then
        $demo.setTotal($demo.getA() + $demo.getB());
end

直接读取Excel决策表处理业务规则

上面介绍了读取excel生成rule文件,然后再通过读取规则文件来处理业务,这样比较麻烦,下面来介绍一下直接读取excel,然后处理业务逻辑
代码如下

//读取excel规则处理逻辑
@Test
public void test1() {
    KieServices kieServices = KieServices.Factory.get();
    Resource dt = ResourceFactory.newClassPathResource("rules/rule.xlsx", getClass());
    KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(dt);
    KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
    kieBuilder.buildAll();
    KieModule kieModule = kieBuilder.getKieModule();
    KieSession kieSession = kieServices.newKieContainer(kieModule.getReleaseId()).newKieSession();

    Demo demo = new Demo();
    demo.setA(6);
    demo.setB(5);
    demo.setC(4);

    kieSession.insert(demo);
    int count = kieSession.fireAllRules();
    System.out.println("总共触发了: " + count + " 条规则");
    System.out.println(demo);
}

总共触发了: 1 条规则

Demo{a=6, b=5, c=4, total=15, errorMsg=[]}

总结
jboss还提供了一个网站,能直接在网页上配置出来规则,更加方便了,不过对于程序员来说,写drl文件应该是首选,对于业务人员写excel应该是首选

Drools规则引擎之整合Spring(三) 7. Spring整合Drools 7.1 Spring简单整合Drools 在项目中使用Drools时往往会跟Spring整合来使用。具体整合步骤如下: 第一步:创建maven工程drools_spring并配置pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001 阅读详情

相关推荐

Drools规则引擎之基础语法(二)

Drools规则引擎之基础语法(二) 4. Drools基础语法 4.1 规则文件构成 在使用Drools时非常重要的一个工作就是编写规则文件,通常规则文件的后缀为.drl。drl是Drools Rule Language的缩写。在规则文件中编写具体的规则内容。 一套完整的规则文件内容构成如下: 关键字 描述 package 包名,只限于逻辑上的管理,同一个包名下的查询或者函数可以直接调用 import 用于导入类或者静态方法 global 全局变量 function

weixin_38236852的博客 764

使用 Drools 规则引擎实现业务逻辑

要求施加在当今软件产品上的大多数复杂性是行为和功能方面的,从而导致组件实现具有复杂的业务逻辑。实现 J2EE 或 J2SE 应用程序中业务逻辑最常见的方法是编写 Java 代码来实现需求文档的规则和逻辑。在大多数情况下,该代码的错综复杂性使得维护和更新应用程序的业务逻辑成为一项令人畏惧的任务,甚至对于经验丰富的开发人员来说也是如此。任何更改,不管多么简单,仍然会产生重编译和重部署成本。 规则

jxguoyan的专栏 893

Drools-规则引擎

规则引擎demo,内涵注释,有助于理解规则引擎实现

[7-05-02].第07节:三方整合 - Spring整合Doorls

b.第二步:创建规则目录/resources/rules,rules目录中创建规则文件helloworld.drl c.第三步:创建Spring配置文件/resources/spring.xml d.第四步:编写单元测试类:

F-T-er 1061

无线网卡选购指南:哪些型号支持Kali Linux的监听模式?附免驱动网卡推荐

本文详细解析了如何在Kali Linux下选购支持监听模式的无线网卡。核心在于选择兼容的芯片组,如Atheros AR9271和Ralink RT3070等经典型号,并提供了免驱动网卡推荐与实战配置指南,帮助安全研究人员和爱好者快速搭建无线测试环境。

wind6的博客 1555

飞腾E2000单板移植openEuler 5.10内核与麒麟系统的实践指南

本文详细介绍了在飞腾E2000单板上移植openEuler 5.10内核并搭配麒麟系统根文件系统的完整实践指南。内容涵盖从编译环境搭建、内核配置裁剪、设备树适配,到根文件系统准备、U-Boot引导配置及启动调试的全流程,旨在帮助开发者打造一个内核版本新、软件生态全的稳定混合系统。

weixin_29309475的博客 258

[7-05-02].第08节:三方整合 - SpringBoot整合Doorls

【代码】[7-05-02].第08节:三方整合 - SpringBoot整合Doorls。

F-T-er 888

BLDC方波控制双闭环Simulink仿真模型

无刷直流电机方波控制双闭环Simulink仿真模型搭建详细教程,包括速度PI环、电流PI环、换向逻辑和受控电压源,仿真结果良好。

m0_57458432的博客 6869

rete算法(drools 转)

rete算法简介           原文连接       Rete算法是Charles Forgy在1979年的论文中首次提出的,针对基于规则知识表现的模式匹配算法。目前来说,大部分规则引擎还是基于rete算法作为核心,但都有所改 进,比如drool,jess等等,下面介绍rete算法的概念,一些术语,以及使用规则引擎需要注意的问题。 先来看看如下的表达式:      (name-o...

Move Fast! 511

不用变压器也能联网?手把手教你PHY芯片直连的3种实用方案

本文详细介绍了PHY芯片直连的3种实用方案,帮助开发者在物联网设备中实现更经济、更精简的网络连接设计。通过分析电压驱动型和电流驱动型PHY的核心原理,提供具体的电路配置和优化建议,确保信号质量的同时节省成本和空间。

smartcontract5的博客 332

C#串口通信从入门到精通(1)——硬件接线

RS-232接口一般都是9针的,有公母头(针头和孔头),为了便有理解以下都称为针头和孔头,针头就是露出来的针,孔头就是9个孔,总共使用3条线进行通信,一条用于发送,一条用于接收,另外一根是GND地线,由于线路的功能是永久性的,设置连接时,必须确保一个节点的发送线与另一个节点的接收线相连,反之亦然,RxD(PC的接收线)连接到TxD(传感器电子设备的发送线),TxD(PC的发送线)连接到RxD(传感器电子设备的发送线)。两条线路的电平都是相对于GND的。因此,GND也必须连接,但不能将GND与屏蔽连接。

qq_34059233的博客 1万+

Drools 规则属性讲解(结合代码实例讲解)

Drools规则引擎的基本概念包括将过程中的对象与实现这些过程的逻辑分离,逻辑则通过编写规则来进行定义。对于每个过程,规则引擎将识别要应用的规则以及要对其执行操作的对象。如果逻辑发生变化,可以通过更新规则而不影响系统的整体架构。今天我们就结合代码实例来聊一聊Drools规则引擎的规则属性。

qq_25409421的博客 1694

构建.NET网站:VSCode还是Visual Studio?揭开开发工具的选择之谜

选择VSCode还是Visual Studio,归根结底是取决于你的具体需求和偏好。🔍 这两款工具各有千秋,都能为你的.NET网站开发提供强大的支持。希望这篇文章能够帮助你更全面地了解这两款工具,做出明智的选择。

墨夶的博客 787

Drools规则引擎debug模式

在《Drools7 规则引擎视频教程》的交流群中,有同学提出这样的问题: 对Drools规则引擎中的drl文件是否可以进行debug操作?如果不能改怎么办? 首先来说debug的问题,drl文件不是不可以debug但是是有限制的:Eclipse或MyEclipse中安装插件,然后drl文件中的语法还需要是MVEL才可以支持debug。而默认基于Java语法的drl文件是没办法进行debug了。 那...

程序新视界 2947

工业4.0必备:C#上位机+数字孪生 生产线实时监控与智能预警系统(工业级实战)

数据割裂:PLC、传感器、工业相机的数据散落在不同系统,想看全局生产状态要切换N个软件,“数据孤岛”导致决策滞后;故障难预判:设备突发故障时,只能停机排查,平均故障响应时间超30分钟,一条生产线停工1小时损失超10万;可视化差:传统监控只有冰冷的数字和2D图表,设备运行状态、生产流程、物料流转无法直观感知,新人上手需3个月才能熟悉产线。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 659

C# 固高板卡(总线型) 操作类

主要功能有:初始化,轴使能,正负方向手动移动,回0,点到点移动,等待移动完成,输入IO数据读取,输出IO控制,清除报警等功能。

StevenChen的博客 571

doors

leanbob的专栏 268

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Drools简单介绍

Drools-在我同学没有跟我说的时候,我都没有听过这个东西,都不知道它是做什么的,于是深夜补充干粮… Drools介绍 Drools简单来说就是规则,他为了规则而生。有些复杂多变的业务场景,仅仅靠我们日常的判断处理是不够的,规则是变化很快的,随着不可控因素(天气,日期,活动等等),规则也是随之变化,而项目是不可能随之而变更上线的。 而Drools中是符合当前的业务场景变化的规则引擎之一。一旦...

wanghao112956的博客 659

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Drools 例子

1. 项目文件结构 2. maven 依赖 <!-- https://mvnrepository.com/artifact/org.drools/drools-core --> <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</...

尼古拉斯.张飞的博客 654

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Drools读取Excel规则表及硬编码两种方式进行规则过滤

概念介绍 Drools规则引擎是对于各种情况的条件进行灵活匹配,从而根据条件返回各种各样的参数。规则匹配的方法分为两种,一种是在项目中硬编码的方式,一种是通过读取符合语法的excel表格。 硬编码语法 package 必须的选项,且放在编码的第一行,代表一种逻辑的区分,不必和真实的物理环境对应 import 与java的import作用及语法相同,导入规则所需要的类,在规则判断中用($对象名)获取导入的对象 rule部分 rule分为三部分,规则基本属性(规则名,执行顺序,...

Gzf的博客 1400

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

package droolsDemo//说明:每个 drl 都必须声明一个包名,这个包名与 Java 里面的不同,它不需要与文件夹的层次结构一致,//主要用于可以根据kmodule.xml中不同的package属性来指定加载哪个.drl文件,//packages="org.some.pkg"表示ksession2只会加载org.some.pkg下的规则文件,如果没写,则默认加载所有的规则文件。//...

weixin_39541767的博客 877

Drools搭建

搭建Drools 增加pom依赖文件 <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>7.7.0.Final</version> &l...

dq407的博客 258

drools规则引擎及springboot快速接入最佳实践

1、简介 drools是从Jboss 开源的规则引擎框架,使用规则文件用于替代复杂多变的if-else条件判断,使规则和核心业务拆开,规则单独配置避免业务变化需要修改代码重新上线问题,其决策表也利于非开发人员通过Excel进行一些规格修改关停,规则文件或扩展的决策表需要遵循一定的语法格式,语法格式比较简单,且idea的drools插件提供了该文件类型的代码提示。 2、适用场景 如果业务if...

MJ的博客 2852

教你一招 用Python实现简易可拓展的规则引擎_用python帮我写一段能够parsers rules 让steam相关源进程走特定的outboun(1)

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。

2401_84572577的博客 899

activiti工作流在线表单设计功能(activiti + ueditor + Ueditor Web Form De

分享一下我老师大神的人工智能教程吧。零基础,通俗易懂!风趣幽默!http://www.captainbed.net/也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 之前实现了activit

qq_43724942的博客 4868
上一篇: pytest-Allure报告
下一篇: 自动化测试-设计模式-介绍
Alice__Time
博客等级 码龄9年 15粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值