《Drools7.0.0.Final规则引擎教程》第4章 4.2 lock-on-active

简介: 《Drools7.0.0.Final规则引擎教程》第4章 4.2 lock-on-active

lock-on-active

当在规则上使用ruleflow-group属性或agenda-group属性的时候,将lock-on-active 属性的值设置为true,可避免因某些Fact对象被修改而使已经执行过的规则再次被激活执行。可以看出该属性与no-loop属性有相似之处,no-loop属性是为了避免Fact被修改或调用了insert、retract、update之类的方法而导致规则再次激活执行,这里的lock-on-active 属性起同样的作用,lock-on-active是no-loop的增强版属性,它主要作用在使用ruleflow-group属性或agenda-group属性的时候。lock-on-active属性默认值为false。与no-loop不同的是lock-on-active可以避免其他规则修改FACT对象导致规则的重新执行。


因FACT对象修改导致其他规则被重复执行示例:


package com.rules
import com.secbro.drools.model.Product;
rule rule1
    no-loop true
    when
        obj : Product(discount > 0);
    then
        obj.setDiscount(obj.getDiscount() + 1);
        System.out.println("新折扣为:" + obj.getDiscount());
        update(obj);
    end
rule rule2
    when
        productObj : Product(discount > 1);
    then
        System.out.println("其他规则被触发了" + productObj.getDiscount());
    end

执行之后打印结果为:

新折扣为:2
其他规则被触发了2
第一次执行命中了2条规则!• 1
• 2
• 3

其他规则(rule2)因FACT对象的改变而被出发了。

通过lock-on-active属性来避免被其他规则更新导致自身规则被重复执行示例:

package com.rules
import com.secbro.drools.model.Product;
rule rule1
    no-loop true
    when
        obj : Product(discount > 0);
    then
        obj.setDiscount(obj.getDiscount() + 1);
        System.out.println("新折扣为:" + obj.getDiscount());
        update(obj);
    end
rule rule2
    lock-on-active true
    when
        productObj : Product(discount > 1);
    then
        System.out.println("其他规则被触发了" + productObj.getDiscount());
    end

很明显在rule2的属性部分新增了lock-on-active true。执行结果为:

新折扣为:2
第一次执行命中了1条规则!• 1
• 2

标注了lock-on-active true的规则不再被触发。

目录
相关文章
|
Java API
JAVA文档并发演示---并发高级对象摘录(Tutorial - Concurrency Lesson--High Level Concurrency Objects)
JAVA文档并发演示---并发高级对象摘录(Tutorial - Concurrency Lesson--High Level Concurrency Objects)
JAVA文档并发演示---并发高级对象摘录(Tutorial - Concurrency Lesson--High Level Concurrency Objects)
《Drools7.0.0.Final规则引擎教程》第4章 4.2 ruleflow-group&salience
《Drools7.0.0.Final规则引擎教程》第4章 4.2 ruleflow-group&salience
294 0
《Drools7.0.0.Final规则引擎教程》第4章 4.2 agenda-group
《Drools7.0.0.Final规则引擎教程》第4章 4.2 agenda-group
146 0
《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop
《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop
142 0
|
算法
《Drools7.0.0.Final规则引擎教程》第4章 global全局变量
《Drools7.0.0.Final规则引擎教程》第4章 global全局变量
358 0
《Drools7.0.0.Final规则引擎教程》番外篇之ruleflow-group合并
《Drools7.0.0.Final规则引擎教程》番外篇之ruleflow-group合并
193 0
《Drools7.0.0.Final规则引擎教程》番外实例篇——activation-group的多FACT对象
《Drools7.0.0.Final规则引擎教程》番外实例篇——activation-group的多FACT对象
238 0
《Drools7.0.0.Final规则引擎教程》番外实例篇——相同对象and List使用
《Drools7.0.0.Final规则引擎教程》番外实例篇——相同对象and List使用
275 0
|
Java 应用服务中间件 API
《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE概念&FACT对象
《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE概念&FACT对象
208 0
《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE概念&FACT对象
|
API
《Drools7.0.0.Final规则引擎教程》第5章 session使用说明
《Drools7.0.0.Final规则引擎教程》第5章 session使用说明
364 0