82.5. 事实类型的属性更改设置和监听程序
默认情况下,决策引擎不会在每次触发规则时重新评估事实类型的所有事实模式,而是只响应给定模式内受限制或绑定的修改属性。例如,如果规则调用 modify () 作为规则操作的一部分,但操作不会在 KIE 基础中生成新的数据,则决策引擎不会自动重新评估所有事实模式,因为没有修改任何数据。此属性重新活动行为可防止 KIE 基础中不需要的递归,并导致更有效的规则评估。这个行为还意味着,您不必使用 no-loop 规则属性来避免无限递归。
您可以使用以下 Knowledgebase BuilderConfiguration 选项修改或禁用此属性重新活动行为,然后根据需要使用 Java 类或 DRL 文件中的属性更改设置来微调属性:
-
ALWAYS: (默认)所有类型都是重新主动的属性,但您可以使用@classReactiveproperty-change 设置禁用特定类型的属性重新活动。 -
ALLOWED: 没有类型是属性重新主动,但您可以使用@propertyReactiveproperty-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