drools规则引擎使用文档

文章目录

  • drools规则引擎使用文档
    • 一、规则文件结构
    • 二、规则体结构
      • 1.Attribute
      • 2.Conditions
      • 3.Actions
    • 三、Query语法
      • 1.基本查询
      • 2.位置语法
    • 四、类型定义与注解
      • 1.类型定义
      • 2.预定义的元数据标签
      • 3.java中使用声明的FactType

一、规则文件结构

packageimportfunction  // Optionalquery  // Optionaldeclare   // Optionalglobal   // Optionalrule "rule name"// Attributeswhen// Conditionsthen// Actions
endrule "rule2 name"...

  • package:可选,默认值defaultpkg(行尾;可以省略)

    若当前kbase指定路径下所有drl均未指定package,则为defaultpkg;

    每个drl文件中仅可出现一次,且必须置于其它代码之前。

    注意:package namespace建议与kbase packages目录保持一致,否则在最新版本中无法通过kbase获取package对象。

  • import:可选,自动导入package同名包及java.lang.*下的类;

  • global:可选,一般用于Service服务类的导入,例如emailServicesmsService,甚至是Spring 容器上下文对象applicationContext

  • 依据上图importdeclareglobalfunctionqueryrule位置是可以互换的。

  • 注释部分 ///*...*/,可出现在代码的任何地方,会被编译器忽略。

    示例:

二、规则体结构

rule "rule_name"// Attribute// Attributewhen// Conditionsthen// Actions
end

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QvYy4GXW-1630918204682)(https://docs.jboss.org/drools/release/7.54.0.Final/drools-docs/html_single/LanguageReference/rule.png)]

1.Attribute

  • ruleflow-groupagenda-group概念已统一,ruleflow-group讲覆盖agenda-group属性。

Since version 6.x the two concepts have been unified, the ruleflow-group name will override the agenda-group.

  • Attribute之间可以使用分割,而非;,可省略)
  • 依据上图salienceenableddate-effectivedate-expiresno-loopagenda-groupactivation-groupdurationtimercalendarauto-focuslock-on-activeruleflow-groupdialect、位置是可以互换的。

示例:

package com.example.drools;dialect  "mvel"rule "rule1"salience 10enabled truedate-effective "4-Sep-2018"date-expires "4-Sep-2022"no-loop trueagenda-group "agenda-group-1"activation-group "activation-group-1"duration 1000timer (cron:0/10 * * * * ? )
//    calendar "* * 0-7,18-23 ? * *"auto-focus falselock-on-active false// 覆盖agenda-group属性值
//    ruleflow-group "ruleflow-group-1"// 覆盖包级别方言dialect "java"whenthenSystem.out.println("rule1");
end

2.Conditions

条件部分由0个或多个patterns组成,多个pattern之间使用andornot组成,默认值and;

pattern括号内部由0个或多个constraints约束部分组成,多个constrain可用,分割(,语法上等同于&&,但优先级小于&&和||);

  • from和entry-point

from和entry-point一起使用,实现eval时载入数据;

rule "Authorize withdrawal"whenWithdrawRequest( $ai : accountId, $am : amount ) from entry-point "ATM Stream"CheckingAccount( accountId == $ai, balance > $am )then// Authorize withdrawal.
end
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.EntryPoint;// Create your KIE base and KIE session as usual:
KieSession session = ...// Create a reference to the entry point:
EntryPoint atmStream = session.getEntryPoint("ATM Stream");// Start inserting your facts into the entry point:
atmStream.insert(aWithdrawRequest);
  • accumulate

自定义聚合函数导入

import accumulate AverageAccumulateFunction.AverageData averagerule "Average profit"when$order : Order()accumulate( OrderItem( order == $order, $cost : cost, $price : price );$avgProfit : average( 1 - $cost / $price ) )then// Average profit for `$order` is `$avgProfit`.
end

3.Actions

  • 数据操作类

actions包括setmodifyupdateinsertLogicaldelete

  • drools内部变量调用,droolskcontext
rule "rule2"whenthenSystem.out.println(drools.getRule().getName());System.out.println(kcontext.getKieRuntime().getEnvironment());
end

三、Query语法

![query](https://img-blog.csdnimg.cn/img_convert/7cdf82c54ac3ffbbcc3f528b13a8341c.png)

说明:Query支持可选参数集合,每一个参数都有可选的类型。如果没有指定类型,则默认为Object类型。,支持Query间嵌套调用;LHSRule中的LHS语法一致代表Pattern;Query为了更加紧凑的代码风格,增加了对positional syntax位置语法的支持。

1.基本查询

  • 无参
query "people under the age of 21"$person : Person( age < 21 )
end
  • 有参
query contains(String $s, String $c)$s := String( this.contains( $c ) )
end

说明: :=pattern with unification; 虽然drools不允许重复声明"绑定",但是支持跨多个属性的参数统一。

示例:

declare PersonFactfirstName : String @position( 1 )lastName : String @position( 0 )age : int @position( 2 )id : int @position( 3 )occupation: String
endrule "rule2"
when// 约束1 限定firstName和lastName;约束2 限定age范围;二者使用id统一参数声明内连接PersonFact("cube", $b:"jack"; $a: age, $id:= id)PersonFact(age<10, $id:= id)
thenSystem.out.println($a);
end

pattern with unification

2.位置语法

positional syntax位置语法用于简化LHS部分代码;可混合使用常规语法命名语法,两者使用;分割,但是位置语法必须放于前;

Location类型为例:

declare Locationthing : Stringlocation : String
end
  • Pattern示例-正确
Location(thing == x, location == y)
Location(x; location == y)
Location(x, y;) // x-代表position为0的字段即thing y-代表position为1的字段即location
Location(x; $p:location == y) // $p-代表patternBinding参数
Location(x; $p:location) // 同上
Location(x, $p;) // 同上
  • Pattern示例-错误
Location(thing == x, y;)
Location(thing == x; y;)

四、类型定义与注解

事实类型元数据可描述在类级别和字段级别,语法格式为 @key(value),例如@position(0)

1.类型定义

  • 无元数据描述信息
import java.util.Datedeclare Personname : StringdateOfBirth : Dateaddress : Address
end
  • 有元数据描述信息
import java.util.Datedeclare Person@author( Bob )@dateOfCreation( 01-Feb-2009 )name : String @key @maxLength( 30 )dateOfBirth : Dateaddress : Address
end

2.预定义的元数据标签

元数据 作用域 可选值 默认值 描述
@role class fact,event fact 该标记决定在复杂事件处理期间,给定的事实类型是作为常规事实对象处理还是作为Drools引擎中的事件对象处理。
@timestamp class session clock 或自定义时间戳属性(可为attribute) session clock 支持参数:会话时钟时间或自定义时间戳属性
@duration class 时间间隔或时间点(可为attribute) Null (zero) 该标记决定Drools引擎中事件的持续时间
@expires class [#d][#h][#m][#s][[ms]] Null (默认时间不在匹配和激活时过期) 此标记决定事件在Drools引擎的工作内存中过期之前的时间。默认情况下,当事件不再匹配和激活任何当前规则时,该事件将过期。您可以定义事件过期的时间。这个标记定义还覆盖了根据时间约束和KIE基中的滑动窗口计算的隐式过期偏移量。只有当Drools引擎以流模式运行时,此标记才可用。
@typesafe class true,false true 该标记决定给定的事实类型是否使用类型安全进行编译。
@serialVersionUID class integer Null 序列化ID,考虑到兼容性建议在相关类或DRL文件类型声明过程中显式指定serialVersionUID(若未指定则根据类各方面特征自动计算)。
@key attribute - - 参与计算equals()hashCode()的属性;同时Drools引擎会隐式地定义3个构造函数,分别为无参构造器、全参构造器、附带@key属性的构造器。
@position attribute integer None 优先级原则:子类>父类;显式指定>未指定;声明顺序
@classReactive class - - 全局开关处于开启状态(默认 ALWAYS),代表属性响应性生效;可以通过该标记禁用指定类的属性响应性,实现微调;ALLOWED对应,每次触发规则时重新评估事实的所有事实模式
@propertyReactive class - - 全局开关处于可选状态(ALLOWED)时,代表属性响应性停用;可以通过该标记启用指定类的属性响应性,实现微调;ALWAYS对应,仅对给定模式内受约束或绑定的修改属性做出反应。DISABLED状态时,所有属性更改侦听器都将被忽略(即不重新评估)。
@watch factPattern Property name, * (all), ! (not), !* (no properties) None 全局开关处于开启状态(ALWAYS)或处于可选状态(ALLOWED)且类被标记为@propertyReactive时,总之,当前类型处于属性响应性状态时,你可以使用通配符或非操作过滤属性;处于非属性响应性,使用@watch或出现冲突例如@watch( firstName, ! firstName ))时编译错误
@propertyChangeSupport class - - 增加该标记,可使drools可以监听javabean的属性变动。

下面以典型的电信领域语音呼叫为例

public class VoiceCall {private String  originNumber;private String  destinationNumber;private Date    callDateTime;private long    callDuration;  // in milliseconds// Constructors, getters, and setters
}
  • 类级别元数据
declare VoiceCall@role( event )@timestamp( callDateTime )@duration( callDuration )@expires( 1h35m )@typesafe( false )@serialVersionUID( 42 )
end
  • @key
declare PersonfirstName : String @keylastName : String @keyage : int
end
  • @position
declare PersonfirstName : String @position( 1 )lastName : String @position( 0 )age : int @position( 2 )occupation: String
enddeclare Student extends Persondegree : String @position( 1 )school : String @position( 0 )graduationDate : Date
end
  • @watch
// Listens for changes in both `firstName` (inferred) and `lastName`:
Person(firstName == $expectedFirstName) @watch( lastName )// Listens for changes in all properties of the `Person` fact:
Person(firstName == $expectedFirstName) @watch( * )// Listens for changes in `lastName` and explicitly excludes changes in `firstName`:
Person(firstName == $expectedFirstName) @watch( lastName, !firstName )// Listens for changes in all properties of the `Person` fact except `age`:
Person(firstName == $expectedFirstName) @watch( *, !age )// Excludes changes in all properties of the `Person` fact (equivalent to using `@classReactivity` tag):
Person(firstName == $expectedFirstName) @watch( !* )
  • @propertyChangeSupport
declare Person@propertyChangeSupport
end

3.java中使用声明的FactType

import java.util.Date;import org.kie.api.definition.type.FactType;
import org.kie.api.KieBase;
import org.kie.api.runtime.KieSession;...// Get a reference to a KIE base with the declared type:
KieBase kbase = ...// Get the declared fact type:
FactType personType = kbase.getFactType("org.drools.examples", "Person");// Create instances:
Object bob = personType.newInstance();// Set attribute values:
personType.set(bob, "name", "Bob" );
personType.set(bob, "dateOfBirth", new Date());
personType.set(bob, "address", new Address("King's Road","London","404"));// Insert the fact into a KIE session:
KieSession ksession = ...
ksession.insert(bob);
ksession.fireAllRules();// Read attributes:
String name = (String) personType.get(bob, "name");
Date date = (Date) personType.get(bob, "dateOfBirth");

Tips:

a.实际使用过程中,可使用Map简化操作

org.kie.api.definition.type.FactType#setFromMap

org.kie.api.definition.type.FactType#getAsMap

b.尽管API的行为类似于Java反射,但API并不使用反射,而是依赖于使用生成的字节码实现的性能更好的访问器

参考:

drools官方文档

未完待续……

drools规则引擎使用文档相关推荐

  1. drools规则引擎可视化_一文看懂开源工作流引擎 Flowable「转」

    原文链接:[https://xie.infoq.cn/article/ece75889c715e0bc87a73e44c]. 一.工作流引擎使用场景 工作流在企业管理系统中是高频使用的功能,一个最常见 ...

  2. 使用 Drools 规则引擎实现业务逻辑,可调试drl文件

    http://www.srcsky.com/tech/arts/389.html 代码下载http://download.csdn.net/detail/zhy011525/2462313 使用 Dr ...

  3. drools规则引擎因为内存泄露导致的内存溢出

    进入这个问题之前,先了解一下drools: 在很多行业应用中比如银行.保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中. 主要存在的问 ...

  4. SpringBoot整合Drools规则引擎动态生成业务规则

    最近的项目中,使用的是flowable工作流来处理业务流程,但是在业务规则的配置中,是在代码中直接固定写死的,领导说这样不好,需要规则可以动态变化,可以通过页面去动态配置改变,所以就花了几天时间去研究 ...

  5. drools规则引擎 java_Drools规则引擎的使用总结

    前一段时间在开发了一个做文本分析的项目.在项目技术选型的过程中,尝试使用了Drools规则引擎.让它来作为项目中有关模式分析和关键词匹配的任务.但后来,因为某种原因,还是撇开了Drools.现将这个过 ...

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

    要求施加在当今软件产品上的大多数复杂性是行为和功能方面的,从而导致组件实现具有复杂的业务逻辑.实现 J2EE 或 J2SE 应用程序中业务逻辑最常见的方法是编写 Java 代码来实现需求文档的规则和逻 ...

  7. 反洗钱检验java_从Drools规则引擎到风控反洗钱系统V0.2.3.pdf

    本文档持续更新中,QQ 技术交流群:593177274,作者邮箱:secbro2@ 从Drools 规则引擎到风控反洗钱 -- <Drools7.0.0.Final 规则引擎教程> 修订日 ...

  8. drools规则引擎的在项目中的使用手记

    需求 按照登录用户的会员等级 和签到周期 根据一定的计算规则送积分.由于之前都是通过if else去做的控制.规则变更的时候可能需要重新调整代码甚至发布服务. 由于不想再每次规则变更后需要调整代码,于 ...

  9. 转载《Drools 规则引擎视频教程》相关事宜

    <Drools 规则引擎视频教程>相关事宜 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.c ...

  10. 详解:Drools规则引擎探究

    引入 ▐ 问题引入 天猫奢品业务方为了吸引更多的新客,和提高会员的活跃度,做了一期活动,通过购买天猫奢品频道内的任意商品就赠送特殊积分,积分可以直接兑换限量的奢品商品.假如业务方给的规则如下: 主刃同 ...

最新文章

  1. vue-vue项目中mock.js的使用
  2. 竞品调研时发现的Android新设计特性
  3. uniapp一键登陆(php)
  4. Linux闲时自动抢占GPU脚本
  5. MySQL跨机房集群方案_Mysql跨机房同步方案
  6. linux原子方式,linux – 以原子方式移动目录
  7. c语言中按字节运算,C语言中位运算的巧用
  8. 平面设计中的网格系统pdf_哪些设计师必看平面设计书籍,写给设计师
  9. 电脑课学生端密码查看
  10. 漫画:六九式是一道简单有趣的算法题(开车...)
  11. c语言混合运算优先级判断,《C语言解惑》—— 3.1 混合运算要小心
  12. 下载MySQL驱动程序
  13. 返回 代码: E_INVALIDARG (0x80070057)解决方法
  14. 心知天气html,Typecho 博客添加“心知天气”网页天气插件教程
  15. 三、使用HM进行简单的视频隐写demo
  16. 批归一化(Batch Normalization)详解
  17. Matlab打开绘图工具
  18. C语言:优先级与运算符的介绍
  19. Spring loosely coupled example
  20. CSS Doodle 生成器

热门文章

  1. springboot快速搭建文件管理系统
  2. STM32在线仿真出现是循环,使用mcuisp下载程序却可以运行,JTAG下载程序可以下载成功,却没有任何动作!
  3. Centos安装Lammps教程——intel、openmpi、fftw环境
  4. 硬件开发过程简介(一)
  5. pk8/pem秘钥转keystore格式
  6. Head First 设计模式
  7. 常用的dos网络命令
  8. 从零开始学androidScrollView滚动视图.十八.
  9. 汇编语言程序设计(一)
  10. Unity3D游戏开发之Unity3D场景编辑器扩展开发