14.7. DRL 中的规则属性


规则属性是您可以添加到新规则中的额外规格,以修改规则行为。在 DRL 文件中,您通常以以下格式定义规则条件和操作之外的规则属性,它们带有多个属性:

rule "rule_name"
    // Attribute
    // Attribute
    when
        // Conditions
    then
        // Actions
end

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

Expand
表 14.1. 规则属性
�性值

salience

定义规则优先级的整数。在激活队列中排序时,具有较高 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

agenda-group

标识您要为其分配该规则的席位组的字符串。通过电缆组,您可以对员工进行分区,以提供更多对规则组的执行控制。只有购买重点组中的规则才能激活。

示例:M ickice-group "GroupName"

activation-group

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

示例: activation-group "GroupName"

duration

较长的整数值,如果仍然满足规则条件,定义规则可以激活的时间(毫秒)。

示例: 持续时间 10000

timer

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

示例: 计时器(cron:9455114 ? ?) (每 15 分钟)

日历

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

示例: calendars " IANA047 0-7,18-23 ?账单" (不包括非工作小时)

auto-focus

布尔值,仅适用于购买组内的规则。选择选项后,下一次规则被激活时,会自动向分配该规则的电缆组提供重点。

示例: auto-focus true

lock-on-active

布尔值,仅适用于规则流组或电缆组内的规则。选择选项后,规则的 ruleflow 组变为 active 或该规则的 sales 组会收到重点,直到 ruleflow 组不再活跃,否则该规则将丢失。这是 no-loop 属性的更强大的版本,因为无论更新的来源(不仅仅是规则本身)都会丢弃匹配的规则激活。此属性适用于计算规则,您可以有多个修改事实的规则,您不希望任何规则重新匹配并再次触发。

示例: lock-on-active true

ruleflow-group

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

示例: ruleflow-group "GroupName"

dialect

JAVAMVEL 识别为规则中代码表达式的语言。默认情况下,该规则使用在软件包级别指定的 dialect。此处指定的任何 dialect 都会覆盖规则的软件包分开设置。

示例: dialect "JAVA"

注意

当您使用没有可执行模型的 Red Hat Process Automation Manager 时,dialect "JAVA" 规则结果只支持 Java 5 语法。有关可执行模型的更多信息,请参阅 打包和部署 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 部分中定义的任何变量。变量可以是可解析到持续时间的任何字符串值,也可以是内部以 数值(以毫秒为单位)值的任何数字值。

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

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

带有可选 startend -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

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部