规则引擎-activiti

本文深入探讨Drools规则引擎的关键概念和技术细节,包括规则文件结构、关键字使用、规则编译过程、新类型的声明、元数据声明、函数与查询定义、规则语法等。同时介绍了如何通过Activiti调用Drools规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

规则引擎(Drools):

1、 规则文件结构:

1 package :规则文件的包名,定义一个名称空间。(package必须定义在规则文件的最前面,其他可以自由定义)

2 import: 声明规则在编译和运行时所用到的java类。默认会导入相同包名的全部的java类和java.lang包下的全部类。

   如果需要的java类和规则文件定义的包名相同,则不需要显示的导入。

3 global:用于定义全局变量(数据或服务对象),一般用于存放规则结果或者与应用进行数据交互。

4 function:用于在规则文件中定义逻辑语句,可以将部署逻辑独立存放到规则文件中,供多个规则调用。

5 queryL:使用查询可以到工作存储空间中查找符合条件的事实数据。(事实数据均会被存储到工作存储空间中)

6 rule:一个rule定义一个业务规则:条件称为:LHS,行为称作:RHS, 使用:when LHS then RHS。

2、 关键字: 

硬关键字:共三个:true , false 和null。约束性较强,不允许用来命名规则元素。

软关键字:四十个:可以但建议不要使用软关键字进行命名。

3、 规则编译:

向KonwledgeBuilder添加规则资源时,KnowledgeBuilder会将解析到的规则内容进行编译,如有语法错误,会封装到KnowledgeBuilderResult的集合,

放到Package的实例中。可以使用KnowledgerBuilder的getError方法获取PackageBuilderErrors实例,调用toString 方法查看错误信息。

4、声明新类型:(实例)

declare Person (declare关键字声明)  extendsOrginalPerson  (支持继承)

@age(33)    

name: String   (属性声明方式:“属性名:类型”,类型可以为基本数据类型和对象)

age: int

Weight: java.math.BigDecimal (对象使用全限定类名,可有不用import导入对象,否则需要显示导入)

end   (以"end"表示结束)

5 声明元数据:(可以用于规则引擎和推理引擎查询)

声明格式:@元数据名称(元数据值)

6 函数的定义和使用,及查询的定义和使用:

函数的定义:function关键字定义,可以再LHS和RHS中调用函数。可以在规则中使用定义的java类的静态方法。

查询的定义:query关键字定义,获取查询的对象需要传入查询中定义的实例标识。

7 规则语法:

1 全局变量

使用“global”关键字定义。在规则中,可以使用全局变量的方法和数据,也可以从规则的执行中得到相应的结果数据。

全局变量不会被写入到Working Memory中,不能在规则条件中使用。全局变量更多会用来存放规则结果,作为应用程序和规则之间

的交互桥梁。

定义的全局变量在使用时,需要进行初始化(调用setGlobal() 方法设置):如:

StatefulKnowledgeSession  ksession = kbase.newStatefulKnowledgeSession();

ksession.setGlobal("maxThan30",new ArrayList<Person>());

如果在规则行为中进行了赋值操作,则不需要进行初始化操作。

2 规则属性

no-loop:默认为false,表示事实对象发生变化时,总会重新匹配该规则。

ruleflow-group:指定某个流程节点使用的规则组。

agenda-group:为规则设定所属的规则组。当规则组获得焦点时,则匹配组内的规则,如果规则组没有获得焦点,则不会触发,默认值为MAIN。

lock-on-active:在一个规则组内,如果一个规则被触发,则使用该属性会判断是否再次触发该规则,为true,则表示不需要再触发这个规则(即符合条件)

auto-focus:如果该属性值为true并且规则符合触发条件,则该规则所在的规则组将会自定获得焦点。默认为false。

activation-group:如果多个规则配置了相同的激活组,则这些规则中只会有一个规则被激活。

salience:默认值为0,该属性配置规则的优先级,属性值越大,规则匹配的优先级越高,可以为负数。

dialect:指定LHS和RHS的表达式方言,当前支持java和mvel,规则中的方言默认和包中指定的方言一致。

date-effective:规则的生效时间,规则将会在该时间之后被触发。

date-expires:规则的有效时间(结束时间),在有效时间之后,规则将不会被触发。

duration:如果一个规则服符合触发条件,那么该属性配置规则被匹配后触发的延迟时间。

3 条件语法

可以直接判断一个对象的属性值,多个属性值以及集合元素等。也可以在条件语句中,直接为事实实例或者属性定义名称,

在行为语句中使用。将条件语句看作一个整体,根据这个整体的最终解雇来判断规则是否执行。

4 行为语法

执行语句用于执行规则触发后的工作。不推荐在行为语句中加入逻辑判断。

Activiti调用规则

使用Activiti中的业务规则任务可以执行一个或者多个业务规则,当前activiti只支持Drools。Activiti在实例化业务规则任务行为时,只需要调用Drools的API,

即可实现规则文件的加载、事实实例的插入,跪着触发等操作。任务的定义者只需要提供参数、规则和计算结果等。

1 业务规则任务

规则文件会被看作资源,被保存在ACT_GE_BYTEARRAY表中。因此在部署流程资源文件时,需要提供这些规则文件。

activiti中对应的行为的实现类:BusinessRuleTaskActivityBehavior。

代码过程实例:

//创建一个KnowledgeBuilder

KnowledgeBuilderkbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();

//添加规则资源到KnowledgeBulider

kbuilder.add(ResourceFactory.newClassPathResource("rule/MyDoors.drl",FirstTest.class),ResourceType.DRL);

if(kbuilder.hasErrors()){

System.out.println(kbuilder.getError().toString());

System.exit(0);

}

//获取知识包集合

Collection<KnowledgePackage>  pkgs  =  kbuilder.getKnowledgePackages();

此处后的功能由BusinessRuleTaskActivityBehavior完成(代码完成不同)

KnowledgeBase的实例创建将由activiti的其他类完成。

//创建KnowledgeBase实例

KnowledgeBase   kbase  =  kbuilder.newKnowledgeBase();     

//将知识包部署到KnowledgeBase中

kbase.addKnowledgePackages(pkbs);

//使用KnowledgeBase创建StatefulKnowledgeSession

StatefulKnowledgeSession  ksession  =  kbase.newStatefulKnowledgeSession();

//创建事实

Person  p1  =  new  Person("person  1",11);

//插入到working memory

ksession.insert(p1);

//匹配规则

ksession.fireAllRules();

//关闭当前的session资源

ksession.dispose();

 2  activiti调用规则步骤:

1 定义相应的javaBean实体类

2 定义需求的规则文件

3 在流程资源文件中添加<businessResultTask>

设置输入参数:ruleVariableInput = "${sale1},${sale2}"

设置返回结果:resultVariable = "saleResults"

4 部署规则文件(.drl)

repositoryService.createDeployment()

.addClasspathResource("rule/sale.drl")

.addClasspathResource("bpmn/saleRule.bpmn")

.deploy();

5 在activiti.cfg.xml配置加入规则文件的部署实现类

<property  name = "customPostDeployers">

<list>

<bean class= "org.activiti.engine.impl.rules.RulesDeployer"  />

</list>

</property>

6 业务规则任务完成后,执行流会到达一个Service Task。

文章摘致于:疯狂workflow讲义 基于activiti工作流的应用开发

第一章 规则引擎初步了解 5 1 为什么会有规则引擎? 5 2 什么是规则引擎? 5 3 为何要使用规则引擎? 6 3.1 声明式编程 6 3.2逻辑与数据分离 6 3.3 速度及可测量性 6 3.4 知识集中化 6 3.5 工具集成 6 3.6 解释机制 6 3.7易懂的规则 7 4 何时应当使用规则引擎? 7 5 如何使用规则引擎? 7 6 何时不要使用规则引擎 ? 8 7 规则引擎的架构和推理 8 8规则引擎的算法 10 9 Java规则引擎商业产品 10 10 Dools介绍 11 第二章. Drools 规则引擎 11 2.1. 概述 11 2.2. 编制 13 2.3. RuleBase 18 2.4. WorkingMemory 和有状态/无状态Sessions 22 2.5. StatefulSession 28 2.6. StatelessSession 29 2.7. Agenda 31 2.8. Truth Maintenance with Logical Objects 34 2.9. 事件模型(Event Model) 37 2.10. 顺序模式 41 第三章. 安装和设置(Core 与IDE) 42 3.1. 安装和使用 42 3.1.1. 依赖库 42 3.1.2. 运行时(Runtime) 43 3.1.3. 安装IDE (规则工作台) 43 3.2. 从源码进行安装 54 3.3. 源码Checkout 54 3.4. 构建 59 3.4.1. 构建源码 59 3.4.2. 构建使用手册 61 3.5. Eclipse 65 3.5.1. 产生Eclipse项目 65 3.5.2. 导入Eclipse项目 66 3.5.3. 导出IDE插件 71 3.5.4. 构建更新站点 76 第四章. 决策表 78 4.1. 在电子表格中的决策表 78 4.1.1. 何时使用决策表 78 4.1.2. 概述 79 4.1.3. 决策表如何工作 81 4.1.4. 关键字和语法 83 4.1.5. 基于决策表建立并集成电子表格 87 4.1.6. 在决策表中管理业务规则 88 第五章. 规则工作台 (IDE) 89 5.1. Introduction 89 5.1.1. 特性概要 90 5.1.2. 建立规则项目 90 5.1.3. 新建规则向导 92 5.1.4. 规则编辑器 94 5.1.5. 视图 95 5.1.6. 领域规范语言DSL 98 5.1.7. The Rete视图 100 5.1.8. 大容量DRL文件 101 5.1.9. 调试规则 102 第六章. 规则语言 103 6.1. 概述 103 6.1.1. 规则文件 103 6.1.2. 规则的构成 104 6.1.3. 保留字 104 6.2. Comments注释 106 6.2.1. 单行注释 106 6.2.2. 多行注释 106 6.3. Package 107 6.3.1. import 108 6.3.2. expander 108 6.3.3. global全局变量 108 6.4. Function 110 6.5. Rule 111 6.5.1. Rule 属性 112 6.5.2. LHS (when) 条件元素 115 6.5.3. The Right Hand Side (then) 140 6.5.4. 对自动封箱/拆箱以及元数据类型的注解 141 6.6. Query 141 6.7. Domain Specific Languages 领域特定语言 142 6.7.1. 何时使用DSL 142 6.7.2. 编辑与管理DSL 143 6.7.3. 在规则中使用DSL 144 6.7.4. 增加对fact的约束 145 6.7.5. DSL如何工作 146 6.7.6. 从头开始建立DSL 146 6.8. 规则流 147 6.8.1. 设置规则所属的规则流组 148 6.8.2. 简单的规则流 148 6.8.3. 如何建立规则流 148 6.8.4. 在你的应用程序中使用规则流 153 6.9. XML规则语言 153 6.9.1. 何时使用XML 153 6.9.2. XML 格式 154 6.9.3. 遗留的Drools 2.x XML 规则格式 159 6.9.4. Automatic transforming between formats (XML and DRL) 159 第七章:部署和测试 160 7.1. 部署选项 160 7.1.1. 使用RuleAgent部署 160 7.1.2. 使用drl源码部署 161 7.1.3. 在你的classpath中部署规则 161 7.1.4. 可部署的对象RuleBase, Package等等. 161 7.1.5. 部署模式 163 7.1.6. Web Services 166 7.1.7. 未来的构想 166 7.2. 测试 166 7.2.1. 测试框架 166 7.2.2. FIT for Rules – 一种规则测试框架 166 第八章. BRMS (业务规则管理系统) 168 8.1. 简介 168 8.1.1. 什么是BRMS? 169 8.1.2. 特性概要 170 8.2. 管理指南 170 8.2.1. 安装 171 8.2.2. 数据库配置 172 8.2.3. 安全性 173 8.2.4. 数据管理 176 8.3. 体系结构 178 8.3.1. 从源码构建 179 8.3.2. 可重用组件 180 8.3.3. 版本和存储库 180 8.3.4. 贡献 181 8.4. 快速使用指南 181 8.4.1. 快速使用指南 181 8.4.2. BRMS 概念 183 8.4.3. The business user perspective 197 8.4.4. 部署: 将规则与你的应用集成 197 8.5. 例子与教程 200 8.5.1. 保险经济折扣 200 第九章. Java规则引擎API 202 9.1 简介 202 9.2 java规则引擎API体系结构 202 9.3 规则管理API 202 9.4 运行时API 203 9.5 java规则引擎API的安全问题 204 9.6 异常与日志 205 9.7 JSR小结 205 9.8 Dools API 参考 205 9.8.1 简介 205 9.8.2. 如何使用 205 9.8.3. 参考书目 209
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值