Drools用户手册翻译——第四章 Drools规则引擎(六)执行控制

主要讲了规则匹配时的优先级设置的方式。

甩锅声明:本人英语一般,翻译只是为了做个笔记,所以有翻译错误的地方,错就错了,如果你想给我纠正,就给我留言,我会改过来,如果懒得理我,就直接划过即可。 

目录

Drools的执行控制

规则的优先级

规则的议程组

规则激活组

drools的规则执行模式和线程安全


Drools的执行控制

当新的规则数据进入Drools的工作内存时,规则就有可能被完全匹配并执行。单个工作内容操作可能导致多个规则的执行。当规则被完全匹配时,Drools会创建一个引用规则和匹配的事实的内部匹配实例,并将这个实例放到Drools的议程中。议程使用冲突解决策略控制着规则内部匹配的执行顺序。

在调用fireAllRule方法之后,drools会重复执行下面两个阶段:

议程评估。在这个阶段,drools选择所有可以被执行的规则。如果没有可执行规则存在,则执行周期结束。如果执行规则被发现,drools在议程中注册一个内部匹配,然后将这个内部匹配转移到工作内存操作阶段去执行规则结果操作。

工作内存操作。在这个阶段,drools对所有在议程中之前注册的激活规则执行规则结果操作(每条规则then后面的部分)。所有的操作完成,或者java应用再次调用fireAllRules之后,drools会返回到议程评估阶段重新评估规则。

图示4. drools执行的两个阶段

当议程上存在多条规则时,一条规则的执行可能会导致议程长的另一条规则被移除。为了防止这件事情发生,你可以定义drools上的规则如何以及何时执行。定义规则执行顺序的常用方法是通过使用规则优先级,议程组,或者内部匹配组。

规则的优先级

每一条规则都有一个salience属性,这个属性可以决定规则的执行顺序。在内部匹配队里里面,优先级越高的规则,执行顺序越靠前。默认的优先级的值是0,优先级的值可以是正数,也可以是负数。

举例来说,drools堆栈中按展示顺序列出了下面的DRL规则示例

rule "RuleA"
salience 95
when
    $fact : MyFact( field1 == true )
then
    System.out.println("Rule2 : " + $fact);
    update($fact);
end

rule "RuleB"
salience 100
when
   $fact : MyFact( field1 == false )
then
   System.out.println("Rule1 : " + $fact);
   $fact.setField1(true);
   update($fact);
end

 RuleB规则是列表中的第二条规则,但是他比ruleA的优先级要高,因此会先执行ruleB。

规则的议程组

议程组,就是有相同agenda-group属性的一组规则集合。议程组在议程上将规则分开。在任何一个时间,只能有一组成为焦点,这组成为焦点的议程组会优先执行,通过调用setFocus方法决定焦点议程组。也可以使用auto-focus属性定义规则,这样,在下一次激活规则时,有这个属性的规则,会让其所在的议程组自动成为焦点。

每次setFocus方法被调用,drools会在堆栈头添加指定的议程组。默认的议程组“MAIN”包含所有没有指定议程组的规则,除非其他议程组有焦点,否则这个默认议程组会第一个执行。

例如:下面的示例DRL规则属于指定议程组,并在drools堆栈中按顺序列出:

银行应用的示例DRL规则

rule "Increase balance for credits"
  agenda-group "calculation"
when
  ap : AccountPeriod()
  acc : Account( $accountNo : accountNo )
  CashFlow( type == CREDIT,
            accountNo == $accountNo,
            date >= ap.start && <= ap.end,
            $amount : amount )
then
  acc.balance  += $amount;
end
rule "Print balance for AccountPeriod"
  agenda-group "report"
when
  ap : AccountPeriod()
  acc : Account()
then
  System.out.println( acc.accountNo +
                      " : " + acc.balance );
end

对于这个例子来说,report议程组的规则必须总是第一个执行,calculation议程组的规则必须是第二个执行,然后执行其余议程组的剩余规则。因此,在其他规则执行之前,report和calculation组必须按顺序接收焦点:

设置议程组执行顺序的焦点

Agenda agenda = ksession.getAgenda();
agenda.getAgendaGroup( "report" ).setFocus();
agenda.getAgendaGroup( "calculation" ).setFocus();
ksession.fireAllRules();

也可以通过clear()方法取消议程组的的执行。

ksession.getAgenda().getAgendaGroup( "Group A" ).clear();

规则激活组

内部匹配组是一组规则,这一组规则拥有相同的actibation-group规则属性。在这组里,只能有一条规则被执行。当这个组里面的某条规则满足条件并执行之后,这个组里的所有其他挂起的规则会被从议程中移除。

例如,下面这个示例DRL规则属于指定的内部匹配组,并像下面展示的顺序排列在drools堆栈中:

银行示例DRL规则

rule "Print balance for AccountPeriod1"
  activation-group "report"
when
  ap : AccountPeriod1()
  acc : Account()
then
  System.out.println( acc.accountNo +
                      " : " + acc.balance );
end
rule "Print balance for AccountPeriod2"
  activation-group "report"
when
  ap : AccountPeriod2()
  acc : Account()
then
  System.out.println( acc.accountNo +
                      " : " + acc.balance );
end

这个例子里,如果report内部匹配组的第一条规则被执行了,则组内的第二条规则和议程上的其他规则都会被移出议程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/44059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css终极方案PostCSS

一见如故 原理 所有的css框架都在一样的事&#xff0c;那就是由一个css生成一个新的css&#xff0c;那么postcss就来做了一个抽离&#xff1a; 1、将原有的css解析成抽象语法树 2、中间经过若干个插件 3、重新文本化&#xff0c;形成新的css postcss.config.js module.expor…

Spring Cloud 负载平衡的意义什么?

目录 一、什么是负载平衡 二、为什么需要负载平衡 三、Spring Cloud 如何实现负载平衡 四、负载平衡的nginx配置 一、什么是负载平衡 负载平衡是指将网络流量在多个服务器之间分布&#xff0c;以达到提高系统性能、增强可靠性和提供更好用户体验的目的。在负载平衡的架构中…

32位Cortex-M4 MCU:LPC54607J256ET180E、LPC54605J512BD100K 180MHz嵌入式微控制器

LPC546xx 32 位微控制器(MCU) 具有丰富的外设集、极低的功耗和增强的调试功能。 LPC546xx MCU系列采用ARM Cortex-M4内核&#xff0c;可提供以太网支持&#xff0c;并设有一个TFT LCD控制器和两个CAN FD模块。LPC546xx MCU旨在提高灵活性和性能可扩展性&#xff0c;可提供高达1…

Java - 泛型

泛型 1、 当我们ArrayList表示存放到ArrayList集合中的元素是Dog类型时 2、如果编译器发现添加的类型&#xff0c;不满足要求&#xff0c;就会报错。 3、遍历的时候直接取出Dog类型&#xff0c;而不是Object。 ArrayList<Week> weeks1 new ArrayList<>();好处…

科研院所用泛微搭建信创办公平台,统一办公,业务融合,安全便捷

国家全面推动重要领域的信创改造工作&#xff0c;要求到2027年底&#xff0c;对综合办公、经营管理、生产运营等系统实现“应替尽替、能替则替”。 科研机构作为智力、知识密集型机构&#xff0c;承载着大量数据、信息资产&#xff0c;数字化程度高&#xff0c;业务系统多样&a…

SpringBoot项目修改Tomcat版本号

SpringBoot项目修改Tomcat版本号 前言如果项目是以jar包形式打包部署如果项目是以war包形式打包部署示例 仰天大笑出门去&#xff0c;我辈岂是蓬蒿人 前言 Springboot项目,默认是使用内嵌Tomcat servlet容器形式打包部署。关于怎么修改默认的版本号&#xff0c;捣鼓了好久终于…

NLP(六十)Baichuan-13B-Chat模型使用体验

2023年7月11日&#xff0c;百川智能正式发布参数量130亿的通用大语言模型Baichuan-13B-Base、对话模型Baichuan-13B-Chat及其INT4/INT8两个量化版本。   本文将介绍大模型BaiChuan-13B-Chat的使用体验&#xff0c;其HuggingFace网址为&#xff1a;https://huggingface.co/bai…

8. Vmvare中重新分配Linux系统的分区空间大小

1. 说明 一般情况下&#xff0c;在使用Vmvare虚拟机创建配置Linux系统时&#xff0c;默认将系统的内存设置为4GB&#xff0c;硬盘大小设置为40GB&#xff0c;但随着空间利用的越来越多&#xff0c;内存会出现不够使用的情况&#xff0c;此时需要重新分配空间大小&#xff0c;具…

一起学数据结构(1)——复杂度

目录 1. 时间复杂度&#xff1a; 1.1 时间复杂度的概念&#xff1a; 1.2 时间复杂度的表示及计算&#xff1a; 1.3 较为复杂的时间复杂度的计算&#xff1a; 2. 空间复杂度&#xff1a; 2.1 空间复杂度的概念&#xff1a; 2.2 空间复杂度的计算&#xff1a; 1. 时间复杂度…

【C++进阶之路】适配器、反向迭代器、仿函数

文章目录 前言一、适配器①模拟实现栈②模拟实现对列 二、反向迭代器三、仿函数总结 前言 我们先来笼统的介绍一下今天的三个内容。 适配器——简单的理解就是复用&#xff0c;用已经实现的轮子&#xff0c;来继续实现某种功能。 反向迭代器——原理很简单&#xff0c;就是对…

Maven发布中央仓库始终报403

把域名 oss.sonatype.org 全部替换为&#xff1a;s01.oss.sonatype.org

Chatgpt Web API 创建对话,免费,不计token数量,模仿网页提交对话

Chatgpt API 是收费的&#xff0c;按token使用量计费 Chatgpt Web API 免费的&#xff0c;只要有账号就可以使用。 curl https://chat.openai.com/backend-api/conversation \-H authority: chat.openai.com \-H accept: text/event-stream \-H accept-language: zh-CN,zh;q…

52.弱集合 WeakSet

WeakSet与Set相似&#xff0c;Set的方法在WeakSet中基本都能使用 WeakSet只能放对象 WeakSet不能被遍历 目录 1 创建WeakSet 2 弱集合的指向问题 1 创建WeakSet 直接在创建的时候把对象放进去是不行的 你需要用add()方法才可以放进去 2 弱集合的指向问题 当你把obj加…

前后端分离windows本地nginx解决跨域

下载 http://nginx.org/en/download.html 命令 启动Nginx&#xff1a; nginx.exe start 快速停止或关闭Nginx&#xff1a; nginx.exe -s stop 正常停止或关闭Nginx&#xff1a; nginx.exe -s quit 配置文件修改重装载命令&#xff1a; nginx.exe -s reload 强制停用…

Java基本数据类型

Java基本数据类型 字面常量数据类型变量整形变量长整形变量短整型变量字节型变量思考浮点型变量双精度浮点型单精度浮点型 字符型布尔型变量 类型转换类型提升 字面常量 字符串常量&#xff1a;由""括起来的&#xff0c;比如“12345”、“hello”、“你好”。整形常量…

机器学习---经验误差与过拟合、方差与偏差、性能度量、比较检验

1. 经验误差与过拟合 第三张图建立的模型&#xff0c;在训练集中通过x可以很好的预测y&#xff0c;然而我们不能预期该模型能够很好的预 测集外的数据&#xff0c;换句话说&#xff0c;这个模型没有很好的泛化能力。 第一张图建立了一个线性模型&#xff0c;但是该模型并没有…

Nginx 301 https跳转后出现跨域和混合内容问题 —— 筑梦之路

问题 在浏览器地址栏敲入url访问静态资源目录时&#xff0c;发现默认跳转到了http协议的地址 如上图所示&#xff0c;客户端https请求先到达API网关&#xff0c;然后网关将请求通过http协议转发到静态资源服务器。 调出浏览器发现客户端发送的https请求收到了一个301状态码的响…

nodejs+vue+elementui学习交流和学习笔记分享系统

Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进行交互&#xff0c;从而使得用户在点击网页进…

Kotlin 协程 CoroutineScope

协程定义&#xff1a; 19年官方是这样说的&#xff1a;协程是轻量级的线程&#xff0c;协程就是 Kotlin 提供的一套线程封装的 API&#xff1b; 现在官方是这样说的&#xff1a;协程是一种并发设计模式&#xff1b; 协程作用&#xff1a; 1.处理耗时任务&#xff1b; 2.保…

Kotlin 新版本 1.9.0重要更新预览

释放 Kotlin 新版本 1.9.0 的强大功能 1. Kotlin K2编译器用于多平台 对K2编译器进行了进一步的改进&#xff0c;使其更加稳定。K2编译器针对JVM目标现已进入Beta版本&#xff0c;并且也可以在多平台项目中使用。 您可以通过将K2配置添加到项目的gradle.properties中&#x…
最新文章