14.9. DRL 中的规则操作(THEN)
规则 随后
部分(也称为规则 的右方(RHS) )包含满足规则条件部分时要执行的操作。操作由一个或多个根据规则条件和软件包中可用数据对象执行结果 的方法 组成。例如,如果某个公司需要 Lan applicant 的时间超过 21 年,则规则状况 Applicant (age < 21)
和 loan applicant 超过 21 年,那么
"Underage"
规则的操作将被设置为 setApproved (false)
,因为 applicant 结束了 loan。
规则操作的主要用途是在决策引擎工作内存中插入、删除或修改数据。有效的规则操作是小、声明性和可读。如果您需要在规则操作中使用必需或有条件的代码,请将规则分成多个较小的和更声明性的规则。
loan 应用程序年龄限制的规则示例
14.9.1. DRL 中支持的规则操作方法 复制链接链接已复制到粘贴板!
DRL 支持以下规则操作方法,您可以在 DRL 规则操作中使用。您可以使用这些方法修改决策引擎的工作内存,而无需首先引用可正常工作的内存实例。这些方法充当 Red Hat Process Automation Manager 发行版本中的 Knowledgebase Helper
类提供的方法快捷方式。
对于所有规则操作方法,请从红帽客户门户网站下载 Red Hat Process Automation Manager 7.9.1 Source Distribution ZIP 文件,再进入到 ~/rhpam-7.9.1-sources/src/drools-$VERSION/drools-core/src/main/java/org/drools/core/spi/KnowledgeHelper.java
。https://access.redhat.com/jbossnetwork/restricted/listSoftware.html
set
使用它来设置字段的值。
set<field> ( <value> )
set<field> ( <value> )
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 设置 loan 应用程序批准值的规则操作示例
$application.setApproved ( false ); $application.setExplanation( "has been bankrupt" );
$application.setApproved ( false ); $application.setExplanation( "has been bankrupt" );
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 修改
使用它来指定为事实修改的字段,并通知决策引擎的变化。这个方法提供了事实更新的结构化方法。它将
更新操作
与 setter 调用相结合,以更改对象字段。modify ( <fact-expression> ) { <expression>, <expression>, ... }
modify ( <fact-expression> ) { <expression>, <expression>, ... }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 修改 loan 应用程序数量和批准的规则操作示例
modify( LoanApplication ) { setAmount( 100 ), setApproved ( true ) }
modify( LoanApplication ) { setAmount( 100 ), setApproved ( true ) }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow update
使用它来指定要更新的字段和整个相关事实,并通知决策引擎的变化。更改事实后,您必须调用
更新
,然后才能更改可能受到更新的值影响的另一个事实。要避免此添加的步骤,请使用modify
方法。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
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 Copied! Toggle word wrap Toggle overflow 更新 loan 应用程序数量和批准的规则操作示例
LoanApplication.setAmount( 100 ); update( LoanApplication );
LoanApplication.setAmount( 100 ); update( LoanApplication );
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果提供 property-change 监听程序,则不需要在对象更改时调用此方法。有关属性更改监听程序的更多信息,请参阅 Red Hat Process Automation Manager 中的 决策引擎。
insert
使用此选项将新事实插入到决策引擎的工作内存中,并根据事实的要求定义生成的字段和值。
insert( new <object> );
insert( new <object> );
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 插入新 loan applicant 对象的规则操作示例
insert( new Applicant() );
insert( new Applicant() );
Copy to Clipboard Copied! Toggle word wrap Toggle overflow insertLogical
使用它来以逻辑方式
将新的
事实插入到决策引擎中。决策引擎负责对事实的插入和重包进行逻辑决策。常规或声明的插入后,必须明确回收事实。逻辑插入后,插入的事实会在插入事实的规则中的条件不再满足满足时自动响应。insertLogical( new <object> );
insertLogical( new <object> );
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 逻辑插入一个新的 loan applicant 对象的规则操作示例
insertLogical( new Applicant() );
insertLogical( new Applicant() );
Copy to Clipboard Copied! Toggle word wrap Toggle overflow delete
使用它来从决策引擎中删除对象。DRL 还支持关键字
retract
并执行相同的操作,但删除
通常在 DRL 代码中首选,以便与关键字插入
保持一致。delete( <object> );
delete( <object> );
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除 loan applicant 对象的规则操作示例
delete( Applicant );
delete( Applicant );
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.9.2. drools 和 kcontext 变量的其他规则操作方法 复制链接链接已复制到粘贴板!
除了标准规则操作方法外,决策引擎还支持方法和预定义的 drools
和 kcontext
变量,您可以在规则操作中使用。
您可以使用 drools
变量从 Red Hat Process Automation Manager 发行版中的 Knowledgebase Helper
类调用方法,这也是标准规则操作方法所基于的类。对于所有 drools
规则操作选项,请从红帽客户门户网站下载 Red Hat Process Automation Manager 7.9.1 Source Distribution ZIP 文件,并进入 ~/rhpam-7.9.1-sources/src/drools-$VERSION/drools-core/src/main/java/org/drools/core/spi/KnowledgeHelper.java
。https://access.redhat.com/jbossnetwork/restricted/listSoftware.html
以下示例是可与 drools
变量一起使用的常用方法:
-
drools.halt ()
: 如果用户或应用程序之前名为fireUntilHalt ()
,则终止规则执行。当用户或应用程序调用fireUntilHalt ()
时,决策引擎以 active 模式启动,并持续评估规则,直到用户或应用程序显式调用halt ()
。否则,决策引擎默认以 被动模式 运行,仅当用户或应用程序显式调用fireAllRules ()
时评估规则。 -
drools.getWorkingMemory ()
:返回WorkingMemory
对象。 -
drools.setFocus ("<agenda_group>")
:设置规则所属的指定机组。 -
drools.getRule ().getName ()
:返回规则的名称。 -
drools.getActivation ()
Tuple
,然后提供对应的激活
。这些调用可用于记录和调试目的。
您可以将 kcontext
变量与 getKieRuntime ()
方法一起使用,从 KieContext
类调用其他方法,并扩展 Red Hat Process Automation Manager 发行版中的 RuleContext
类。完整的知识 Runtime API 通过 kcontext
变量公开,并提供广泛的规则操作方法。对于所有 kcontext
规则操作选项,请从红帽客户门户网站下载 Red Hat Process Automation Manager 7.9.1 Source Distribution ZIP 文件,并进入 ~/rhpam-7.9.1-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
以下示例是可与 kcontext.getKieRuntime ()
变量组合一起使用的常用方法:
-
kcontext.getKieRuntime ().halt ()
: 如果用户或应用程序之前名为fireUntilHalt ()
,则终止规则执行。这个方法等同于drools.halt ()
方法。当用户或应用程序调用fireUntilHalt ()
时,决策引擎以 active 模式启动,并持续评估规则,直到用户或应用程序显式调用halt ()
。否则,决策引擎默认以 被动模式 运行,仅当用户或应用程序显式调用fireAllRules ()
时评估规则。 kcontext.getKieRuntime ().getAgenda ()
:返回对 KIE 会话Agenda
的引用,并提供对规则激活组、规则关联组和 ruleflow 组的访问。访问销售组"CleanUp"的调用示例并设置重点
kcontext.getKieRuntime().getAgenda().getAgendaGroup( "CleanUp" ).setFocus();
kcontext.getKieRuntime().getAgenda().getAgendaGroup( "CleanUp" ).setFocus();
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个示例等同于
drools.setFocus ("CleanUp")
。-
kcontext.getKieRuntime ().getQueryResults (<string> query)
: 运行查询并返回结果。这个方法等同于drools.getKieRuntime ().getQueryResults ()
。 -
kcontext.getKieRuntime ().getKieBase ()
: 返回KieBase
对象。KIE 基础是您规则系统中的所有知识来源,以及当前 KIE 会话的来源。 -
kcontext.getKieRuntime ().setGlobal ()
,~.getGlobal ()
,~.getGlobals ()
:设置或检索全局变量。 -
kcontext.getKieRuntime ().get
: 返回运行时环境,类似于您的操作系统环境。Environment
()
14.9.3. 带有条件和命名结果的高级规则操作 复制链接链接已复制到粘贴板!
通常,有效的规则操作是小、声明性和可读。然而,在某些情况下,对每个规则有一个结果的限制可能会有一定难度,并导致详细和重复的规则语法,如下例所示:
带有详细和重复语法的规则示例
重复的部分解决方案是使第二个规则扩展第一个规则,如下例所示:
带有扩展条件的部分增强的示例规则
作为效率更高的替代方案,您可以使用修改条件将两个规则整合到一条规则中,并标记对应的规则操作,如下例所示:
带有条件和命名结果的合并示例规则
这个示例规则使用两个操作:常见的默认操作,另一个名为 grant Discount
的操作。当 KIE 基础中发现存在 60 年以上的客户时,无论客户是否有问题,都以条件激活 giveDiscount
操作。
您可以使用额外条件配置命名结果的激活,如以下示例中的 if
语句。if
语句中的条件总是在紧接它前的模式上评估。
带有额外条件的合并示例规则
如果构建构建,您还可以使用 嵌套
来评估不同的规则条件,如下例所示:
带有更复杂的条件的合并示例规则
这个示例规则为黄金客户提供了 10% 的参与和免费服务,但只提供一个 5%,而不会免费给 Silver 客户使用。规则激活名为 give Discount5 的结果
,并带有关键字 break
而不是 do
。关键字在决策引擎人员中调度结果,使规则条件的剩余部分能够继续评估,同时 会破坏
任何进一步的条件评估。如果命名结果与带有
do
但没有激活的任何条件不匹配,则该规则将无法编译,因为规则条件部分永远不会被达到。