RuleUnit+Quarkus示例DRL文件中modify与update的区别是什么
Drools中modify与update的区别及操作影响
一、modify与update的核心区别
二者都是Drools规则中用于通知引擎Fact对象发生变更的操作,核心差异如下:
- 语法形式不同
update是基础操作,需要先手动修改Fact属性,再单独调用通知方法,写法如下:$l.setApproved(true); update($l);modify是封装后的语法糖,将属性修改和引擎通知逻辑整合到了一起,你示例中的modify($l) { setApproved(true) };完全等价于上面两行代码,写法更简洁,也能避免遗漏update调用导致引擎感知不到Fact变更的问题。 - 匹配性能不同
高版本Drools中,modify支持细粒度属性变更感知,引擎可以识别你具体修改了Fact的哪个属性,只会重新匹配和该属性相关的规则,不会触发不必要的全量重匹配。而update是直接通知引擎整个Fact对象发生了变更,不管你实际修改了几个属性,都会重新匹配所有关联该Fact的规则,性能开销更高。 - 校验时机不同
modify块内的set方法会在规则编译阶段做类型校验,如果你写了不存在的属性/方法,编译时就会直接报错。update的属性修改逻辑没有编译阶段校验,写错可能到运行阶段才会触发异常。
二、操作是否会修改关联文件
不会。
不管是modify还是update,修改的都只是规则引擎工作内存中加载的Fact对象的内存值,完全不会触碰本地DRL文件、数据源原始文件或者其他持久化存储的文件内容。如果你需要把修改后的结果持久化,需要在规则逻辑或者业务代码里额外编写持久化处理逻辑。
内容的提问来源于stack exchange,提问作者maxloo
相关产品推荐
相关产品推荐

