16.9. DRL(THEN)中的规则操作


规则的 then 部分(也称为规则的 右 Hand Side(RHS) )包含满足规则条件部分时要执行的操作。操作由一个或多个 方法 组成,它们根据规则条件和软件包中的可用数据对象执行结果。例如,如果某个公司需要 Lan applicant 的时间超过 21 年,则规则状况 Applicant (age < 21)和 loan applicant 超过 21 年, "Underage" 规则的操作将被设置为 setApproved (false),因为 applicant 结束了 loan。

规则操作的主要用途是在决策引擎工作内存中插入、删除或修改数据。有效的规则操作是 small、声明和可读。如果您需要在规则操作中使用需要或有条件的代码,请将该规则分成多个较小的子声明规则。

loan Application age 限制的规则示例

rule "Underage"
  when
    application : LoanApplication()
    Applicant( age < 21 )
  then
    application.setApproved( false );
    application.setExplanation( "Underage" );
end
Copy to Clipboard Toggle word wrap

16.9.1. DRL 中支持的规则操作方法

DRL 支持在 DRL 规则操作中使用的以下规则操作方法。您可以使用这些方法修改决策引擎的工作内存,而无需首先引用正常工作的内存实例。这些方法充当 Red Hat Process Automation Manager 发行版本中 RuleContext 类提供的方法快捷方式。

对于所有规则操作方法,请从红帽客户门户网站下载 Red Hat Process Automation Manager 7.13.5 Source Distribution ZIP 文件,并导航到 ~/rhpam-7.13.5-sources/src/kie-api-parent-$VERSION/kie-api/src/main/java/org/kie/api/runtime/rule/RuleContext.java. https://access.redhat.com/jbossnetwork/restricted/listSoftware.html

set

使用此选项设置字段的值。

set<field> ( <value> )
Copy to Clipboard Toggle word wrap

设置 loan application 批准的值的规则操作示例

$application.setApproved ( false );
$application.setExplanation( "has been bankrupt" );
Copy to Clipboard Toggle word wrap

修改

使用此选项指定要修改的字段,并通知更改的决策引擎。此方法提供了一种结构化方法来事实更新。它将 更新操作与 设置者调用合并,以更改对象字段。

modify ( <fact-expression> ) {
    <expression>,
    <expression>,
    ...
}
Copy to Clipboard Toggle word wrap

修改 loan Application 数量和批准的规则操作示例

modify( LoanApplication ) {
        setAmount( 100 ),
        setApproved ( true )
}
Copy to Clipboard Toggle word wrap

update

使用此选项指定字段和要更新的完整相关事实,并通知更改的决策引擎。事实更改后,您必须在更改可能受更新的值影响的其他事实之前调用 更新。要避免添加的步骤,请改为使用 修改 方法。

update ( <object, <handle> )  // Informs the decision engine that an object has changed

update ( <object> )  // Causes `KieSession` to search for a fact handle of the object
Copy to Clipboard Toggle word wrap

更新 loan Application 数量和批准的规则操作示例

LoanApplication.setAmount( 100 );
update( LoanApplication );
Copy to Clipboard Toggle word wrap

注意

如果您提供属性更改监听程序,则在对象更改时不需要调用这个方法。有关属性更改监听程序的更多信息,请参阅 Red Hat Process Automation Manager 中的 决策引擎

insert

使用它来将 新事实 插入到决策引擎的工作内存中,并根据需要定义结果字段和值。

insert( new <object> );
Copy to Clipboard Toggle word wrap

插入新 loan applicant 对象的规则操作示例

insert( new Applicant() );
Copy to Clipboard Toggle word wrap

insertLogical

使用它来在决策引擎中以逻辑方式插入新的事实。决策引擎负责对插入和检索事实的逻辑决策。在常规或声明插入后,必须明确调整事实。逻辑插入后,当插入事实的条件不再为 true 时,插入的事实会自动清空。

insertLogical( new <object> );
Copy to Clipboard Toggle word wrap

用于逻辑地插入新 loan applicant 对象的规则操作示例

insertLogical( new Applicant() );
Copy to Clipboard Toggle word wrap

delete

使用它来从决策引擎中删除对象。DRL 中还支持关键字 retract,并执行同样的操作,但 删除 通常优先于 DRL 代码,以便通过关键字 插入

delete( <object> );
Copy to Clipboard Toggle word wrap

删除 loan applicant 对象的规则操作示例

delete( Applicant );
Copy to Clipboard Toggle word wrap

16.9.2. drools 变量的其他规则操作方法

除了标准规则操作方法外,决策引擎还支持方法和预定义的 drools 变量,您可以在规则操作中使用。

您可以使用 drools 变量从 Red Hat Process Automation Manager 发行版中的 org.kie.api.runtime.rule.RuleContext 类调用方法,这也是标准规则操作方法所基于的类。对于所有 drools 规则操作选项,请从红帽客户门户网站下载 Red Hat Process Automation Manager 7.13.5 Source Distribution ZIP 文件,并导航到 ~/rhpam-7.13.5-sources/src/kie-api-parent-$VERSION/kie-api/src/main/java/org/kie/api/runtime/rule/RuleContext.javahttps://access.redhat.com/jbossnetwork/restricted/listSoftware.html

drools 变量包含有关触发规则的信息以及激活触发规则的事实集合的方法:

  • drools.getRule ().getName () :返回当前触发的规则的名称。
  • drools.getMatch () :返回激活当前触发规则的 匹配。它包含记录和调试目的的信息,例如 drools.getMatch ().getObjects () 返回对象列表,允许规则按照正确的元组顺序触发。

drools 变量中,您还可以获得对 KieRuntime 的引用,提供与正在运行的会话交互的有用方法,例如:

  • drools.getKieRuntime ().halt (): 如果之前称为 fireUntilHalt () 的用户或应用程序执行,则终止规则执行。当用户或应用程序调用 fireUntilHalt () 方法时,决策引擎以 active 模式启动,并评估规则,直到用户或应用程序显式调用 halt () 方法。否则,决策引擎默认以 被动模式 运行,仅当用户或应用程序显式调用 fireAllRules () 方法时评估规则。
  • drools.getKieRuntime ().getAgenda () :返回对 KIE 会话 Agenda 的引用,并提供对规则激活组、规则站组和 ruleflow 组的访问。

访问日程表组"CleanUp"的示例,并设置重点

drools.getKieRuntime().getAgenda().getAgendaGroup( "CleanUp" ).setFocus();
Copy to Clipboard Toggle word wrap

+ 这个示例将重点设置为规则所属的指定电缆组。

  • drools.getKieRuntime ().setGlobal (), ~.getGlobal (), ~.getGlobals () :设置或检索全局变量。
  • drools.getKieRuntime ().get Environment () :返回运行时环境,类似于您的操作系统环境。
  • drools.getKieRuntime ().getQueryResults (<string> query) : 运行查询并返回结果。

16.9.3. 具有条件和命名后果的高级规则操作

通常,有效的规则操作是小的、声明性且可读。然而,在有些情况下,每个规则具有单一后果的限制可能有一定难度,从而导致详细和重复的规则语法,如下例所示:

具有详细和重复语法的规则示例

rule "Give 10% discount to customers older than 60"
  when
    $customer : Customer( age > 60 )
  then
    modify($customer) { setDiscount( 0.1 ) };
end

rule "Give free parking to customers older than 60"
  when
    $customer : Customer( age > 60 )
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
end
Copy to Clipboard Toggle word wrap

重复部分解决方案是使第二规则扩展第一条规则,如以下修改的示例所示:

有扩展条件的部分增强示例规则

rule "Give 10% discount to customers older than 60"
  when
    $customer : Customer( age > 60 )
  then
    modify($customer) { setDiscount( 0.1 ) };
end

rule "Give free parking to customers older than 60"
    extends "Give 10% discount to customers older than 60"
  when
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
end
Copy to Clipboard Toggle word wrap

作为更有效的替代方法,您可以使用修改后的条件和标记的相应规则操作将这两个规则整合到一条规则中,如下例所示:

带有条件和名为 results 的整合示例规则

rule "Give 10% discount and free parking to customers older than 60"
  when
    $customer : Customer( age > 60 )
    do[giveDiscount]
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
  then[giveDiscount]
    modify($customer) { setDiscount( 0.1 ) };
end
Copy to Clipboard Toggle word wrap

这个示例规则使用两个操作:通常的默认操作以及名为 giveDiscount 的另一个操作。当一个超过 60 年的客户在 KIE 基础中发现时,giveDiscount 操作是激活的,无论客户是否拥有回车。

您可以使用额外条件(如以下示例中的 if 语句)配置命名结果的激活。if 语句中的条件始终评估在之前紧随它的模式。

带有额外条件的合并示例规则

rule "Give free parking to customers older than 60 and 10% discount to golden ones among them"
  when
    $customer : Customer( age > 60 )
    if ( type == "Golden" ) do[giveDiscount]
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
  then[giveDiscount]
    modify($customer) { setDiscount( 0.1 ) };
end
Copy to Clipboard Toggle word wrap

您还可以使用嵌套(如果构建)等嵌套评估不同的规则条件,如以下更复杂的示例所示:

具有更复杂的条件合并的示例规则

rule "Give free parking and 10% discount to over 60 Golden customer and 5% to Silver ones"
  when
    $customer : Customer( age > 60 )
    if ( type == "Golden" ) do[giveDiscount10]
    else if ( type == "Silver" ) break[giveDiscount5]
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
  then[giveDiscount10]
    modify($customer) { setDiscount( 0.1 ) };
  then[giveDiscount5]
    modify($customer) { setDiscount( 0.05 ) };
end
Copy to Clipboard Toggle word wrap

这个示例规则为 10% 的折扣,免费向高金客户打电话,但只购买 5% 的折扣,而无需免费向 Silver 客户打电话。该规则激活了名为 giveDiscount5 的后果,其关键字为 break 而不是 do。关键字在决策引擎日程表中产生后果,使规则条件的其余部分能够继续评估,同时 中断 会阻止任何进一步的状况评估。如果一个命名后果与具有 do 的任何条件不匹配,但没有通过 中断 激活,则该规则无法编译,因为不会到达规则的条件部分。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat