16.7. DRL 中的规则属性
规则属性是您可以添加到业务规则中修改规则行为的额外规格。在 DRL 文件中,通常以以下格式在规则条件和操作之上定义规则属性:
下表列出了您可以分配给规则的属性的名称和支持值:
| 属性 | 值 |
|---|---|
|
| 定义规则优先级的整数。在激活队列中排序时,具有较高优先级的规则会被赋予更高的优先级。
示例: |
|
| 布尔值。选择了 选项后,会启用该规则。如果没有选择 选项,该规则将被禁用。
示例: |
|
|
包含日期和时间定义的字符串。只有在当前日期和时间后面是
示例: |
|
|
包含日期和时间定义的字符串。如果当前的日期和时间位于
示例: |
|
| 布尔值。选择 选项时,如果规则触发之前满足条件,则无法重新激活该规则(循环)。如果没有选择条件,可以在这些情形中循环该规则。
示例: |
|
| 为您指定要为其分配该规则的日程表组的字符串。日程表组允许您对规则组进行更多执行控制。只有已获取焦点的管理者组中的规则才能够被激活。
示例: |
|
| 您要为其分配该规则的激活(或 XOR)组的字符串。在激活组中,只能激活一条规则。第一条规则取消激活组中所有规则的待处理激活。
示例: |
|
| 如果规则条件仍满足,则用于定义在激活规则的时间持续时间(以毫秒为单位)的长整数值。
示例: |
|
|
用于标识
示例: |
|
| 用于调度规则的 Quartz 日历定义。
示例: |
|
| 布尔值,仅适用于 schedule groups 中的规则。选择 选项时,下一次激活规则时,会自动把焦点分配给分配给该规则的日程表组。
示例: |
|
|
布尔值,仅适用于规则流组或日程组中的规则。选择了 选项时,规则的 ruleflow 组下次变为活跃时间,或者规则的日程表组接收焦点,无法再次激活该规则,直到 ruleflow 组不再活跃,否则将失去焦点。这是
示例: |
|
| 标识规则流组的字符串。在规则流组中,只有在相关规则流激活组时,规则才能触发。
示例: |
|
|
标识
示例: 注意
当您在没有可执行模型的情况下使用 Red Hat Decision Manager 时, |
16.7.1. DRL 中的计时器和日历规则属性 复制链接链接已复制到粘贴板!
计时器和日历是 DRL 规则属性,可让您将调度和时间限制应用到 DRL 规则。根据用例,这些属性需要额外的配置。
DRL 规则中的 timer 属性是识别 int (interval)或 cron 计时器定义的字符串,用于调度规则并支持以下格式:
计时器属性格式
timer ( int: <initial delay> <repeat interval> ) timer ( cron: <cron expression> )
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 )
// 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 计时器属性示例
// Run every 15 minutes timer ( cron:* 0/15 * * * ? )
// Run every 15 minutes
timer ( cron:* 0/15 * * * ? )
间隔定时计时器遵循 java.util.Timer 对象的语义,其初始延迟和可选的重复间隔。cron 计时器遵循标准 Unix cron 表达式。
以下示例 DRL 规则每 15 分钟使用 cron 计时器发送 SMS 文本消息:
带有 cron 计时器的 DRL 规则示例
通常,一个由计时器控制的规则在触发规则并且根据计时器设置重复执行规则时,会变为活跃的规则。当规则条件不再与传入的事实匹配时,执行将停止。但是,决策引擎通过定时器处理规则的方式取决于决策引擎是 主动模式 还是采用 被动模式。
默认情况下,决策引擎以 被动模式 运行,并根据定义的计时器设置(用户或应用程序明确调用 fireAllRules() )来评估规则。相反,如果用户或应用程序调用 fireUntilHalt(),则决策引擎以 主动模式 启动,并持续评估规则,直到用户或应用明确调用 halt()。
当决策引擎处于主动模式时,即使在从调用返回至 fireUntilHalt() 后,也会执行规则后果,而且决策引擎会保持对工作内存做出的任何更改。例如,删除触发计时器规则执行这一事实,会导致重复执行终止,并插入事实,以便某些规则匹配会导致规则执行。但是,决策引擎不会持续 激活,但只有在执行规则后才活跃。因此,在下一次执行计时器控制的规则前,决策引擎不会响应异步事实插入。禁止 KIE 会话终止所有计时器活动。
当决策引擎采用被动模式时,只有在再次调用 fireAllRules() 时,才会评估定时规则规则。但是,您可以通过使用 TimedRuleExecutionOption 选项配置 KIE 会话,以被动模式更改默认的 timer-execution 行为,如下例所示:
KIE 会话配置,以被动模式自动执行规则
KieSessionConfiguration ksconf = KieServices.Factory.get().newKieSessionConfiguration(); ksconf.setOption( TimedRuleExecutionOption.YES ); KSession ksession = kbase.newKieSession(ksconf, null);
KieSessionConfiguration ksconf = KieServices.Factory.get().newKieSessionConfiguration();
ksconf.setOption( TimedRuleExecutionOption.YES );
KSession ksession = kbase.newKieSession(ksconf, null);
您还可以在 TimedRuleExecutionOption 选项上设置 FILTERED 规格,该规格允许您定义回调来过滤这些规则,如下例所示:
KIE 会话配置,过滤自动执行哪些时间规则
对于间隔计时器,您还可以使用带有 expr 而不是 int 的表达式计时器,将延迟和间隔定义为表达式,而不是固定值。
以下示例 DRL 文件声明了一个事实类型,其延迟和周期后带有表达式计时器,并在后续规则中使用的周期:
带有表达式计时器的规则示例
本例中的表达式(如 $d 和 $p )可以使用规则的模式匹配中定义的任何变量。变量可以是可以解析为持续时间的任何 String 值,也可以是内部转换为 长 值(以毫秒为单位)转换的任何数值。
间隔和表达式计时器可使用以下可选参数:
-
:开始和结束日期或代表一个长值的字符串。该值也可以是以新。日期((Number)n)格式转换为 Java 日期的数字 -
repeat-limit:定义计时器允许的最大重复数的整数。如果同时设置了end和repeat-limit参数,则计时器在到达两个的第一个时停止。
可选的 start、end 和 repeat-limit 参数的 timer 属性示例
timer (int: 30s 1h; start=3-JAN-2020, end=4-JAN-2020, repeat-limit=50)
timer (int: 30s 1h; start=3-JAN-2020, end=4-JAN-2020, repeat-limit=50)
在这个示例中,在 2020 年 1 月 3 日开始(从 2020 年 1 月 3 日开始,或当周期重复 50 次时)为每小时调度规则。
如果系统暂停(例如,会话被序列化后,然后是反序列化),则规则被调度为从缺失的激活中恢复,无论暂停期间丢失了多少激活,然后被调度该规则以与计时器设置继续同步。
DRL 规则中的 calendar 属性是用于调度规则的 Quartz 日历定义,它支持以下格式:
calendar 属性格式
calendars "<definition or registered name>"
calendars "<definition or registered name>"
日历属性示例
// Exclude non-business hours calendars "* * 0-7,18-23 ? * *" // Weekdays only, as registered in the KIE session calendars "weekday"
// 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)
Calendar weekDayCal = QuartzHelper.quartzCalendarAdapter(org.quartz.Calendar quartzCal)
在 KIE 会话中注册日历
ksession.getCalendars().set( "weekday", weekDayCal );
ksession.getCalendars().set( "weekday", weekDayCal );
您可以将日历用于标准规则,以及使用计时器的规则。calendar 属性可以包含一个或多个以 字符串 文字形式编写的日历名称。
以下示例规则使用日历和计时器来调度规则:
带有日历和计时器的规则示例