14.7. DRL 中的规则属性
规则属性是您可以添加到新规则中的额外规格,以修改规则行为。在 DRL 文件中,您通常以以下格式定义规则条件和操作之外的规则属性,它们带有多个属性:
rule "rule_name"
// Attribute
// Attribute
when
// Conditions
then
// Actions
end
下表列出了您可以分配给规则的属性的名称和支持值:
| �性 | 值 |
|---|---|
|
| 定义规则优先级的整数。在激活队列中排序时,具有较高 salience 值的规则会被赋予更高的优先级。
示例: |
|
| 布尔值。选择选项时,将启用该规则。如果没有选择该选项,则禁用该规则。
示例: |
|
|
包含日期和时间定义的字符串。只有在当前日期和时间在日期
示例: |
|
|
包含日期和时间定义的字符串。如果当前日期和时间在
示例: |
|
| 布尔值。选择选项时,如果规则重新触发之前满足的条件,则无法重新激活(循环)规则。如果没有选择条件,则在以下情况下可以循环该规则。
示例: |
|
| 标识您要为其分配该规则的席位组的字符串。通过电缆组,您可以对员工进行分区,以提供更多对规则组的执行控制。只有购买重点组中的规则才能激活。
示例:M |
|
| 标识您要为其分配该规则的激活(或 XOR)组的字符串。在激活组中,只能激活一条规则。触发的第一个规则将取消激活组中所有规则的所有待处理激活。
示例: |
|
| 较长的整数值,如果仍然满足规则条件,定义规则可以激活的时间(毫秒)。
示例: |
|
|
标识
示例: |
|
| 用于调度规则的 Quartz 日历定义。
示例: |
|
| 布尔值,仅适用于购买组内的规则。选择选项后,下一次规则被激活时,会自动向分配该规则的电缆组提供重点。
示例: |
|
|
布尔值,仅适用于规则流组或电缆组内的规则。选择选项后,规则的 ruleflow 组变为 active 或该规则的 sales 组会收到重点,直到 ruleflow 组不再活跃,否则该规则将丢失。这是
示例: |
|
| 标识规则流组的字符串。在规则流中,规则只能在由关联规则流激活组时触发。
示例: |
|
|
将
示例: 注意
当您使用没有可执行模型的 Red Hat Process Automation Manager 时, |
14.7.1. DRL 中的计时器和日历规则属性 复制链接链接已复制到粘贴板!
计时器和日历是 DRL 规则属性,可让您将调度和时间限制应用到 DRL 规则。根据用例,这些属性需要额外的配置。
DRL 规则中的 timer 属性是一个字符串,用于标识 int (interval)或用于调度规则的 cron 计时器定义,并支持以下格式:
计时器属性格式
timer ( int: <initial delay> <repeat interval> )
timer ( cron: <cron expression> )
间隔计时器属性示例
// Run after a 30-second delay
timer ( int: 30s )
// Run every 5 minutes after a 30-second delay each time
timer ( int: 30s 5m )
cron timer 属性示例
// Run every 15 minutes
timer ( cron:* 0/15 * * * ? )
间隔计时器遵循 java.util.Timer 对象的语义,其初始延迟和可选的重复间隔。Cron timers 遵循标准 Unix cron 表达式。
以下示例 DRL 规则使用 cron 计时器每 15 分钟发送 SMS 文本消息:
带有 cron 计时器的 DRL 规则示例
rule "Send SMS message every 15 minutes"
timer ( cron:* 0/15 * * * ? )
when
$a : Alarm( on == true )
then
channels[ "sms" ].insert( new Sms( $a.mobileNumber, "The alarm is still on." );
end
通常,当触发规则时,计时器控制的规则将变为活动状态,并根据计时器设置重复执行规则结果。当规则条件不再与传入的事实匹配时,执行会停止。但是,决策引擎处理带有计时器的规则的方式取决于决策引擎是否处于 主动模式 还是 被动模式。
默认情况下,当用户或应用程序显式调用 fireAllRules () 时,决策引擎以 被动模式 运行,并根据定义的计时器设置评估规则。相反,如果用户或应用程序调用 fireUntilHalt (),决策引擎以 active 模式启动,并持续评估规则,直到用户或应用程序显式调用 halt ()。
当决策引擎处于 active 模式时,即使控制返回从调用返回 fireUntilHalt (),并且决策引擎仍与对工作内存所做的任何更改保持主动时,也会执行规则结果。例如,删除触发计时器规则执行的事实会导致重复执行终止,并插入事实,以便某些规则匹配会导致执行该规则。但是,决策引擎不会持续 激活,但仅在执行规则后处于活动状态。因此,在下一次执行计时器控制的规则前,决策引擎不会响应异步事实插入。分离 KIE 会话会终止所有计时器活动。
当决策引擎处于被动模式时,只有在再次调用 fireAllRules () 时,才会评估时间规则的规则结果。但是,您可以使用 TimedRuleExecutionOption 选项配置 KIE 会话来更改被动模式的默认 timer-execution 行为,如下例所示:
KIE 会话配置,以便在被动模式下自动执行时间规则
KieSessionConfiguration ksconf = KieServices.Factory.get().newKieSessionConfiguration();
ksconf.setOption( TimedRuleExecutionOption.YES );
KSession ksession = kbase.newKieSession(ksconf, null);
您还可以在 TimedRuleExecutionOption 选项上设置 FILTERED 规格,它可让您定义一个回调来过滤这些规则,如下例所示:
KIE 会话配置,以过滤自动执行哪个时间规则
KieSessionConfiguration ksconf = KieServices.Factory.get().newKieSessionConfiguration();
conf.setOption( new TimedRuleExecutionOption.FILTERED(new TimedRuleExecutionFilter() {
public boolean accept(Rule[] rules) {
return rules[0].getName().equals("MyRule");
}
}) );
对于间隔计时器,您还可以使用带有 expr 的表达式计时器,而不是 int 将延迟和间隔定义为表达式而不是固定值。
以下示例 DRL 文件声明了一个事实类型,其中包含一个延迟和周期,然后在后续规则中使用表达式计时器:
带有表达式计时器的规则示例
declare Bean
delay : String = "30s"
period : long = 60000
end
rule "Expression timer"
timer ( expr: $d, $p )
when
Bean( $d : delay, $p : period )
then
// Actions
end
本例中的表达式(如 $d 和 $p )可以使用规则的 pattern-matching 部分中定义的任何变量。变量可以是可解析到持续时间的任何字符串值,也可以是内部以 长 数值(以毫秒为单位)值的任何数字值。
间隔和表达式计时器都可以使用以下可选参数:
-
Start和end:代表日期或一个。长值的字符串该值也可以是转换为新。日期((Number) n).longValue ()格式的 Java 日期的数字 -
repeat-limit:一个整数,用于定义计时器允许的最大重复数。如果同时设置了end和repeat-limit参数,则计时器会在达到两者的第一个时停止。
带有可选 start、end -limit 和 repeat-limit 参数的 timer 属性示例
timer (int: 30s 1h; start=3-JAN-2020, end=4-JAN-2020, repeat-limit=50)
在这个示例中,规则会每小时调度一次,每周延迟 30 秒后,从 2020 年 1 月 3 日开始,并在 2020 年 1 月 4 日结束,或者循环重复了 50 次。
如果系统暂停(例如,会话会被序列化,然后调度之后的反序列化),无论在暂停期间丢失了多少激活,规则都会被调度一次,以继续与计时器设置同步。
DRL 规则中 的日历 属性是一个 Quartz 日历定义,用于调度规则并支持以下格式:
日历属性格式
calendars "<definition or registered name>"
日历属性示例
// Exclude non-business hours
calendars "* * 0-7,18-23 ? * *"
// Weekdays only, as registered in the KIE session
calendars "weekday"
您可以基于 Quartz 日历 API 调整 Quartz 日历,然后在 KIE 会话中注册日历,如下例所示:
调整 Quartz Calendar
Calendar weekDayCal = QuartzHelper.quartzCalendarAdapter(org.quartz.Calendar quartzCal)
在 KIE 会话中注册日历
ksession.getCalendars().set( "weekday", weekDayCal );
您可以将日历与标准规则一起使用,以及使用计时器的规则。calendar 属性可包含一个或多个以 String 字面形式编写的日历名称。
以下示例规则使用日历和计时器来调度规则:
带有日历和计时器的规则示例
rule "Weekdays are high priority"
calendars "weekday"
timer ( int:0 1h )
when
Alarm()
then
send( "priority high - we have an alarm" );
end
rule "Weekends are low priority"
calendars "weekend"
timer ( int:0 4h )
when
Alarm()
then
send( "priority low - we have an alarm" );
end