rule的salience(突出性)属性,定义rule的执行顺序

属性值越高,执行的优先级越高。

RuleB虽然定义在RuleA的后边,但salience值比较高,所以总优先执行。

rule "RuleA"
salience 95
when$fact : MyFact( field1 == true )
thenSystem.out.println("Rule2 : " + $fact);update($fact);
endrule "RuleB"
salience 100
when$fact : MyFact( field1 == false )
thenSystem.out.println("Rule1 : " + $fact);$fact.setField1(true);update($fact);
end

rule group的agenda属性,定义一组rule和其他组的执行顺序

通过设置agenda-group的属性,将一组rule绑定到一个组中。
在同一时刻,只有一个组被focus,其中的rule将会被执行。
可以为rule设置auto-focus属性,那么rule所在的组会自动被focus。
默认情况下,所有没有设置group的rule都会放到"MAIN"组中。如果其他组也没有设置focus,那么"MAIN"中的将会在所有的组之前执行。
例子:

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

report必须在calculation之前执行,且这两个分组在所有的rule之前执行,则需要在java中如下设置。

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

也可以取消一个组内所有rule的执行。

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

activation-group控制一组rule的排他性

activation-group下只有一个符合条件的rule执行。

rule "Print balance for AccountPeriod1"activation-group "report"
whenap : AccountPeriod1()acc : Account()
thenSystem.out.println( acc.accountNo +" : " + acc.balance );
end
rule "Print balance for AccountPeriod2"activation-group "report"
whenap : AccountPeriod2()acc : Account()
thenSystem.out.println( acc.accountNo +" : " + acc.balance );
end

只会执行一个。

rule执行模式以及drools引擎的线程安全

被动模式

默认模式。
明确调用fireAllRules()触发rule。
Drools引擎中的被动模式最适合于需要直接控制规则评估和执行的应用程序,或者适合于在Drools引擎中使用伪时钟实现的复杂事件处理(CEP)应用程序。

KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration();
config.setOption( ClockTypeOption.get("pseudo") );
KieSession session = kbase.newKieSession( conf, null );
SessionPseudoClock clock = session.getSessionClock();session.insert( tick1 );
session.fireAllRules();clock.advanceTime(1, TimeUnit.SECONDS);
session.insert( tick2 );
session.fireAllRules();clock.advanceTime(1, TimeUnit.SECONDS);
session.insert( tick3 );
session.fireAllRules();session.dispose();

主动模式

用户调用fireUntilHalt()将会开启主动模式。程序会不断处理,直到调用了halt()。
Drools引擎中的Active模式最适合将规则评估和执行的控制权委托给Drools引擎的应用程序,或者适合使用Drools引擎中的实时时钟实现的复杂事件处理(CEP)应用程序。

KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration();
config.setOption( ClockTypeOption.get("realtime") );
KieSession session = kbase.newKieSession( conf, null );new Thread( new Runnable() {@Overridepublic void run() {session.fireUntilHalt();}
} ).start();session.insert( tick1 );... Thread.sleep( 1000L ); ...session.insert( tick2 );... Thread.sleep( 1000L ); ...session.insert( tick3 );session.halt();
session.dispose();

尽管应该避免同时使用fireAllRules()和fireUntilHalt()调用,特别是来自不同线程的调用,但是Drools引擎可以使用线程安全逻辑和内部状态机安全地处理这种情况。如果正在调用一个fireAllRules(),并且您调用了fireUntilHalt(),那么Drools引擎将继续以被动模式运行,直到fireAllRules()操作完成,然后以主动模式启动以响应fireUntilHalt()调用。

Fact在Drools引擎中的传播模式

  • Lazy模式:
    默认模式。批处理方式。
    fact的处理顺序不能保证和输入顺序相同。
  • Immediate:
    fact在输入的时候,立即传播出去。可以保证顺序性。
  • Eager:
    在rule执行之前,批量传播。

可以通过@Propagation()改变单个rule的传播模式。type可以是LAZY, IMMEDIATE, 或者 EAGER。

query Q (Integer i)String( this == i.toString() )
endrule "Rule" @Propagation(IMMEDIATE)when$i : Integer()?Q( $i; )thenSystem.out.println( $i );
end

议程估算过滤器

调用fireAllRules()的时候,可以指定过滤器,过滤哪些rule执行。

ksession.fireAllRules( new RuleNameEndsWithAgendaFilter( "Test" ) );

默认过滤器包括名称匹配,名称前缀匹配,名称后缀匹配等。

DRL rule集合中的rule unit

rule unit 是数据源,全局变量,DRL rule的组,为了特定的目的组织起来。
rule unit是对agenda group以及activation group的加强。
定义rule unit:

package org.mypackage.myunit;public static class AdultUnit implements RuleUnit {private int adultAge;private DataSource<Person> persons;public AdultUnit( ) { }public AdultUnit( DataSource<Person> persons, int age ) {this.persons = persons;this.age = age;}// A data source of `Persons` in this rule unit:public DataSource<Person> getPersons() {return persons;}// A global variable in this rule unit:public int getAdultAge() {return adultAge;}// Life-cycle methods:@Overridepublic void onStart() {System.out.println("AdultUnit started.");}@Overridepublic void onEnd() {System.out.println("AdultUnit ended.");}
}

persons是Person类型fact的集合。整个rule unit的数据源。
adultAge是一个全局变量,所有的rule都可以引用。
onStart() onEnd()是rule unit的生命周期接口。

Method Invoked when
onStart() Rule unit execution starts
onEnd() Rule unit execution ends
onSuspend() Rule unit execution is suspended (used only with runUntilHalt())
onResume() Rule unit execution is resumed (used only with runUntilHalt())
onYield(RuleUnit other) The consequence of a rule in the rule unit triggers the execution of a different rule unit

默认,所有的rule都在DRL文件同名的rule unit下。如果DRL文件的包路径和名字,和一个实现了Rulenit接口的类相同,那么DRL下所有的rule都会加入这个unit。
可以通过unit关键字更改unit的名字。

package org.mypackage.myunit
unit AdultUnitrule Adultwhen$p : Person(age >= adultAge) from personsthenSystem.out.println($p.getName() + " is adult and greater than " + adultAge);
end

可以通过更简单的方式OOPath访问数据源。

package org.mypackage.myunit
unit AdultUnitrule Adultwhen$p : /persons[age >= adultAge]thenSystem.out.println($p.getName() + " is adult and greater than " + adultAge);
end

Unit执行方法。

// Create a `RuleUnitExecutor` class and bind it to the KIE base:
KieBase kbase = kieContainer.getKieBase();
RuleUnitExecutor executor = RuleUnitExecutor.create().bind( kbase );// Create the `AdultUnit` rule unit using the `persons` data source and run the executor:
RuleUnit adultUnit = new AdultUnit(persons, 18);
executor.run( adultUnit );

除了创建一个Rule Unit的实例,也可以通过绑定的方式传入数据。

executor.bindVariable( "persons", persons );.bindVariable( "adultAge", 18 );
executor.run( AdultUnit.class );

可以通过注解@UnitVar来更改绑定接口中的key。

package org.mypackage.myunit;public static class AdultUnit implements RuleUnit {@UnitVar("minAge")private int adultAge = 18;@UnitVar("data")private DataSource<Person> persons;
}
executor.bindVariable( "data", persons );.bindVariable( "minAge", 18 );
executor.run( AdultUnit.class );

drools学习笔记-rule组织方式相关推荐

  1. 黑马Drools学习笔记(一)——Drools规则引擎示例概述以及SpringBoot整合示例

    文章目录 1. 问题引出 2. 规则引擎概述 2.1 什么是规则引擎 2.2 使用规则引擎的优势 2.3 规则引擎应用场景 2.4 Drools介绍 3. Drools入门案例 3.1 业务场景说明 ...

  2. Drools学习笔记4-第一个例子

    安装环境有了,下面开始做第一个例子. 新建一个Drools工程,新建时就会生成一个hello world的例子.这个例子我看了一下,没多看.从网上找了一个更复杂的例子.例子的具体内容自己去看.下面主要 ...

  3. Drools 学习笔记(一)----stateless session(无状态会话) 的使用

    关于Drools: Drools是jboss的一款开源的业务规则引擎,具有速度快.效率高.易学习的特点. 本文内容参考自Drools 官方文档 7.9.0.Final版 https://docs.jb ...

  4. 黑马Drools学习笔记(三)——Drools规则属性

    文章目录 规则属性 attributes 1 enabled属性 2 dialect属性 3 salience属性 4 no-loop属性 5 activation-group属性 6 agenda- ...

  5. 前端学习笔记之——组织内容

    组织内容 1.建立段落 p 元素代表段落.段落包含着一个或多个相关句子. 元素 p 元素类型 流 允许具有的父元素 任何可以包含流元素的元素 局部属性 无 标签用法 开始标签和结束标签 习惯样式 p ...

  6. AM335x(TQ335x)学习笔记——使用dtb方式启动内核

    老式的u-boot使用ATAGS的方式启动linux内核,本文使用新式的dtb方式启动内核. 我使用的内核是linux-3.17.2版本,下面开始编译内核. (1) 解压内核 [php] view p ...

  7. Drools学习笔记3—Conditions / LHS—字段约束连接字段约束操作符

    字段约束连接 用于字段约束 对象内部多个约束连接,采用"&&"(and)."||"(or)和","(and) 执行顺序:&q ...

  8. Arduino学习笔记之供电方式

    Arduino UNO 的四种供电方式 一.使用USB 端口供电 供电电压:5V,可直接使用电脑的USB供电口 二.使用 Vin 引脚供电 供电电压:DC 7V~12V 三.使用 5V 引脚供电 供电 ...

  9. Kinect开发学习笔记之(八)彩色、深度、骨骼和用户抠图结合

    Kinect开发学习笔记之(八)彩色.深度.骨骼和用户抠图结合 zouxy09@qq.com http://blog.csdn.net/zouxy09 我的Kinect开发平台是: Win7 x86 ...

  10. Kinect开发学习笔记之(七)骨骼数据的提取

    Kinect开发学习笔记之(七)骨骼数据的提取 zouxy09@qq.com http://blog.csdn.net/zouxy09 我的Kinect开发平台是: Win7x86 + VS2010 ...

最新文章

  1. 权重对生成对抗网络GAN性能的影响
  2. Java设计模式详解
  3. Git——[error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054]解决方案
  4. MySQL导入冲突保留两者_面试被问MySQL 主从复制,怎么破?
  5. LeetCode 923. 三数之和的多种可能(双指针)
  6. 全球首发!5G折叠屏笔记本电脑ThinkPad X1 Fold震撼上市
  7. 网上路径的图片有时候遍历不出来_最短路径问题(1)——Dijkstra算法
  8. java类读取properties里内容
  9. Android 如何在Eclipse中查看Android API源码 及 support包源码
  10. VB6(Fast Report Studio 4.6.80)
  11. 常用模块(collections模块,时间模块,random模块,os模块,sys模块,序列化模块,re模块,hashlib模块,configparser模块,logging模块)...
  12. arm架构与体系结构
  13. 理解GAN网络基本原理
  14. lwj_C#_周总结1
  15. KM盒子表格排版操作技巧
  16. 你们想要的这本硬件书!终于来了!(内含赠书福利)
  17. 剑指offer算法题分析与整理(二)
  18. 技术报告 | 华为云中国信通院:云原生2.0 白皮书.pdf(附下载链接)
  19. 判断web网站是否站库分离
  20. win10系统获取管理员权限的设置方法一览

热门文章

  1. 列表解析式,生成表达式
  2. Classics Sentence Excerpt
  3. pdo操作oracle,PDO基础操作
  4. 前端面试 - css , 布局 ,js ,vue
  5. STM32项目设计:基于STM32F4的电子阅读器制作教程
  6. D语言(Dlang)在单片机(cortex-m)上应用方法
  7. 专家建议将“元宇宙”更名为“元网络”或“灵境网络” 回归本质 规范发展
  8. Delta RPMs disabled because /usr/bin/applydeltarpm not installed.问题解决记录
  9. 蓝桥杯 连续区间数(抖机灵做法)
  10. csgo查询服务器延迟,《csgo》网络延迟怎么查看 网络延迟ping查看方法分享