16.7. DRL 中的规则属性


规则属性是您可以添加到业务规则中修改规则行为的额外规格。在 DRL 文件中,通常以以下格式在规则条件和操作之上定义规则属性:

rule "rule_name"
    // Attribute
    // Attribute
    when
        // Conditions
    then
        // Actions
end
Copy to Clipboard Toggle word wrap

下表列出了您可以分配给规则的属性的名称和支持值:

Expand
表 16.1. 规则属性
属性

salience

定义规则优先级的整数。在激活队列中排序时,具有较高优先级的规则会被赋予更高的优先级。

示例: salience 10

enabled

布尔值。选择了 选项后,会启用该规则。如果没有选择 选项,该规则将被禁用。

示例: enabled true

date-effective

包含日期和时间定义的字符串。只有在当前日期和时间后面是 date-effective 属性后才能激活该规则。

示例: 日期为 "4-Sep-2018"

date-expires

包含日期和时间定义的字符串。如果当前的日期和时间位于 date-expires 属性后,则无法激活该规则。

示例: date-expires "4-Oct-2018"

no-loop

布尔值。选择 选项时,如果规则触发之前满足条件,则无法重新激活该规则(循环)。如果没有选择条件,可以在这些情形中循环该规则。

示例: no-loop true

日程表(日程)

为您指定要为其分配该规则的日程表组的字符串。日程表组允许您对规则组进行更多执行控制。只有已获取焦点的管理者组中的规则才能够被激活。

示例: 日程-组 "GroupName"

activation-group

您要为其分配该规则的激活(或 XOR)组的字符串。在激活组中,只能激活一条规则。第一条规则取消激活组中所有规则的待处理激活。

示例: activation-group "GroupName"

duration

如果规则条件仍满足,则用于定义在激活规则的时间持续时间(以毫秒为单位)的长整数值。

示例: duration 10000

timer

用于标识 int (interval)或 cron 计时器定义的字符串,用于调度规则。

示例: timer(cron:* 0/15 * * ?) (每 15 分钟)

日历

用于调度规则的 Quartz 日历定义。

示例: calendars "* * 0-7,18-23 ?* *" (排除非工作时间)

auto-focus

布尔值,仅适用于 schedule groups 中的规则。选择 选项时,下一次激活规则时,会自动把焦点分配给分配给该规则的日程表组。

示例: auto-focus true

lock-on-active

布尔值,仅适用于规则流组或日程组中的规则。选择了 选项时,规则的 ruleflow 组下次变为活跃时间,或者规则的日程表组接收焦点,无法再次激活该规则,直到 ruleflow 组不再活跃,否则将失去焦点。这是 no-loop 属性的一个更强大的版本,因为无论更新的来源,都丢弃匹配规则的激活(而不只是规则本身)。此属性非常适合计算规则,其中有多个规则修改事实,而您不想再次匹配和触发任何规则。

示例: lock-on-active true

ruleflow-group

标识规则流组的字符串。在规则流组中,只有在相关规则流激活组时,规则才能触发。

示例: ruleflow-group "GroupName"

dialect

标识 JAVAMVEL 的字符串,用作规则中代码表达式的语言。默认情况下,该规则使用在软件包级别上指定的断言。这里指定的任意分区会覆盖规则的软件包选择设置。

示例: 第一个"JAVA"

注意

当您在没有可执行模型的情况下使用 Red Hat Process Automation Manager 时,去选"JAVA" 规则会导致只支持 Java 5 语法。有关可执行模型的更多信息,请参阅 打包和部署 Red Hat Process Automation Manager 项目

16.7.1. DRL 中的计时器和日历规则属性

计时器和日历是 DRL 规则属性,可让您将调度和时间限制应用到 DRL 规则。根据用例,这些属性需要额外的配置。

DRL 规则中的 timer 属性是识别 int (interval)或 cron 计时器定义的字符串,用于调度规则并支持以下格式:

计时器属性格式

timer ( int: <initial delay> <repeat interval> )

timer ( cron: <cron expression> )
Copy to Clipboard Toggle word wrap

间隔计时器属性示例

// Run after a 30-second delay
timer ( int: 30s )

// Run every 5 minutes after a 30-second delay each time
timer ( int: 30s 5m )
Copy to Clipboard Toggle word wrap

cron 计时器属性示例

// Run every 15 minutes
timer ( cron:* 0/15 * * * ? )
Copy to Clipboard Toggle word wrap

间隔定时计时器遵循 java.util.Timer 对象的语义,其初始延迟和可选的重复间隔。cron 计时器遵循标准 Unix cron 表达式。

以下示例 DRL 规则每 15 分钟使用 cron 计时器发送 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
Copy to Clipboard Toggle word wrap

通常,一个由计时器控制的规则在触发规则并且根据计时器设置重复执行规则时,会变为活跃的规则。当规则条件不再与传入的事实匹配时,执行将停止。但是,决策引擎通过定时器处理规则的方式取决于决策引擎是 主动模式 还是采用 被动模式

默认情况下,决策引擎以 被动模式 运行,并根据定义的计时器设置(用户或应用程序明确调用 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);
Copy to Clipboard Toggle word wrap

您还可以在 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");
    }
}) );
Copy to Clipboard Toggle word wrap

对于间隔计时器,您还可以使用带有 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
Copy to Clipboard Toggle word wrap

本例中的表达式(如 $d$p )可以使用规则的模式匹配中定义的任何变量。变量可以是可以解析为持续时间的任何 String 值,也可以是内部转换为 值(以毫秒为单位)转换的任何数值。

间隔和表达式计时器可使用以下可选参数:

  • 开始和结束 代表 日期或 一个长值的字符串该值也可以是以 日期 (( Number )n)格式转换为 Java 日期的数字
  • repeat-limit :定义计时器允许的最大重复数的整数。如果同时设置了 endrepeat-limit 参数,则计时器在到达两个的第一个时停止。

可选的 startendrepeat-limit 参数的 timer 属性示例

timer (int: 30s 1h; start=3-JAN-2020, end=4-JAN-2020, repeat-limit=50)
Copy to Clipboard Toggle word wrap

在这个示例中,在 2020 年 1 月 3 日开始(从 2020 年 1 月 3 日开始,或当周期重复 50 次时)为每小时调度规则。

如果系统暂停(例如,会话被序列化后,然后是反序列化),则规则被调度为从缺失的激活中恢复,无论暂停期间丢失了多少激活,然后被调度该规则以与计时器设置继续同步。

DRL 规则中的 calendar 属性是用于调度规则的 Quartz 日历定义,它支持以下格式:

calendar 属性格式

calendars "<definition or registered name>"
Copy to Clipboard Toggle word wrap

日历属性示例

// Exclude non-business hours
calendars "* * 0-7,18-23 ? * *"

// Weekdays only, as registered in the KIE session
calendars "weekday"
Copy to Clipboard Toggle word wrap

您可以基于 Quartz 日历 API 调节 Quartz 日历,然后在 KIE 会话中注册日历,如下例所示:

改编 Quartz Calendar

Calendar weekDayCal = QuartzHelper.quartzCalendarAdapter(org.quartz.Calendar quartzCal)
Copy to Clipboard Toggle word wrap

在 KIE 会话中注册日历

ksession.getCalendars().set( "weekday", weekDayCal );
Copy to Clipboard Toggle word wrap

您可以将日历用于标准规则,以及使用计时器的规则。calendar 属性可以包含一个或多个以 字符串 文字形式编写的日历名称。

以下示例规则使用日历和计时器来调度规则:

带有日历和计时器的规则示例

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
Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat