搜索

85.5. 为事实类型更改设置和监听程序

download PDF

默认情况下,决策引擎不会在每次触发规则时重新评估所有事实类型的事实模式,而是仅响应给定模式内受限制或绑定的属性。例如,如果规则调用 modify() 作为规则操作的一部分,但该操作不会在 KIE 基础中生成新数据,则决策引擎不会自动重新评估所有事实模式,因为没有修改数据。这个属性 reactivity 行为可防止 KIE 库中不需要的递归,并导致更有效的规则评估。这个行为还意味着您不需要总是使用 no-loop rule 属性来避免无限重复。

您可以使用以下 KnowledgeBuilderConfiguration 选项修改或禁用此属性重新活动行为,然后根据需要使用 Java 类或 DRL 文件中的属性更改设置来微调属性重新活动:

  • ALWAYS:(默认)所有类型都是属性 reactive,但您可以使用 @classReactive 属性-change 设置禁用特定类型的属性重新活动。
  • ALLOWED :无类型是属性 reactive,但您可以使用 @propertyReactive 属性-change 设置为特定类型启用属性重新活动。
  • DISABLED: No type 是属性 reactive。所有属性更改监听程序都会被忽略。

在 KnowledgeBuilderConfiguration 中属性重新活动设置示例

KnowledgeBuilderConfiguration config = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
config.setOption(PropertySpecificOption.ALLOWED);
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(config);

或者,您可以在 Red Hat Process Automation Manager 发行版的 standalone.xml 文件中更新 drools.propertySpecific 系统属性:

在系统属性中设置的属性重新活动示例

<system-properties>
  ...
  <property name="drools.propertySpecific" value="ALLOWED"/>
  ...
</system-properties>

决策引擎支持以下属性更改设置和监听程序,用于事实类或声明的 DRL 事实类型:

@classReactive

如果在决策引擎中将属性重新活动设置为 ALWAYS (所有类型都是 reactive),则此标签会禁用特定 Java 类的默认属性重新活动行为或声明的 DRL 事实类型。如果您希望决策引擎在每次触发规则时重新评估指定事实类型的所有事实模式,则可使用此标签,而不是仅响应给定模式内受约束或绑定的属性。

示例: 禁用 DRL 类型声明中的默认属性重新活动

declare Person
  @classReactive
    firstName : String
    lastName : String
end

示例:禁用 Java 类中的默认属性重新活动

@classReactive
public static class Person {
    private String firstName;
    private String lastName;
}

@propertyReactive

如果在决策引擎中将属性重新活动设置为 ALLOWED (没有属性重新活跃),则此标签为特定 Java 类启用属性重新活动,或者为声明的 DRL 事实类型启用属性重新活动。如果您希望决策引擎仅响应指定事实类型内受限制或绑定的属性,则可使用此标签,而不是在每次触发规则时重新评估所有事实模式。

示例:在 DRL 类型声明中启用属性重新活动(在全局禁用重新活动时)

declare Person
  @propertyReactive
    firstName : String
    lastName : String
end

示例:在 Java 类中启用属性重新活动(当全局禁用重新活动时)

@propertyReactive
public static class Person {
    private String firstName;
    private String lastName;
}

@watch

此标签为您在 DRL 规则中以实际模式指定的附加属性启用属性重新活动。只有在决策引擎中将属性重新活动设置为 ALWAYS 时,或将属性重新活动设置为 ALLOWED 且相关事实类型使用 @propertyReactive 标签时,才支持该标签。您可以在 DRL 规则中使用此标签在事实属性重新活动逻辑中添加或排除特定属性。

默认参数: None

支持的参数:Property name, * (全部)、! (不是)、!* (无属性)

<factPattern> @watch ( <property> )

示例:在事实模式下启用或禁用属性重新活动

// Listens for changes in both `firstName` (inferred) and `lastName`:
Person(firstName == $expectedFirstName) @watch( lastName )

// Listens for changes in all properties of the `Person` fact:
Person(firstName == $expectedFirstName) @watch( * )

// Listens for changes in `lastName` and explicitly excludes changes in `firstName`:
Person(firstName == $expectedFirstName) @watch( lastName, !firstName )

// Listens for changes in all properties of the `Person` fact except `age`:
Person(firstName == $expectedFirstName) @watch( *, !age )

// Excludes changes in all properties of the `Person` fact (equivalent to using `@classReactivity` tag):
Person(firstName == $expectedFirstName) @watch( !* )

如果您在使用 @classReactive 标签的事实类型中使用 @watch 标签(禁用属性重新活动),或在决策引擎中将属性重新活动设置为 ALLOWED,则决策引擎将 @watch 标签用于属性。如果您在监听器注解中重复属性(如 @watch(firstName, ! firstName) )时,也会发生编译错误。

@propertyChangeSupport

对于实现对 JavaBeans 规格中定义的属性更改的事实,此标签使决策引擎能够监控事实属性中的更改。

示例: Declare 属性更改在 JavaBeans 对象中支持

declare Person
    @propertyChangeSupport
end

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.