82.5. 事实类型的属性更改设置和监听程序


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

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

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

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>

决策引擎支持以下 property-change 设置和监听程序作为事实类或声明的 DRL 事实类型:

@classReactive

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

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

declare Person
  @classReactive
    firstName : String
    lastName : String
end

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

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

@propertyReactive

如果在决策引擎中将属性 reactivity 设置为 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 规则中的事实模式中指定的额外属性启用属性重新活动。只有在决策引擎中将属性 reactivity 设置为 ALWAYS,或者如果属性 reactivity 设为 ALLOWED 时,才会支持该标签,相关事实类型使用 @propertyReactive 标签。您可以在 DRL 规则中使用该标签,在事实属性重新活动逻辑中添加或排除特定属性。

默认参数: None

支持的参数:Property name, rhncfg (all), ! (not), ! the ! the no properties)

<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( !* )

如果您在事实类型中使用 @watch 标签处理使用 @classReactive 标签(禁用属性重新活动),或者在决策引擎中将属性重新活动时,决策引擎会生成一个编译错误,相关事实类型不使用 @propertyReactive 标签。如果您在监听器注解中重复的属性(如 @watch (firstName, ! firstName) ),也会出现编译错误。

@propertyChangeSupport

对于实施对 TTY 规范中定义的属性更改的支持的事实,此标签可让决策引擎监控事实属性中的更改。https://download.oracle.com/otndocs/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/

示例:Aronlare 属性更改对 sVirt 对象的支持

declare Person
    @propertyChangeSupport
end

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部