85.5. 为事实类型更改设置和监听程序
默认情况下,决策引擎不会在每次触发规则时重新评估所有事实类型的事实模式,而是仅响应给定模式内受限制或绑定的属性。例如,如果规则调用 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