Jboss 为什么这条规则运行不止一次?

Jboss 为什么这条规则运行不止一次?,jboss,drools,Jboss,Drools,我创建了此规则: rule "Product PRODUCT_A is not available from other insurers as INSURER_A" when $p : Policy(insurer.name != "INSURER_A", product.name == "PRODUCT_A", $v : validations) not (Validation(level == ValidationLevel.ERROR) from $v) then

我创建了此规则:

rule "Product PRODUCT_A is not available from other insurers as INSURER_A"
when
    $p : Policy(insurer.name != "INSURER_A", product.name == "PRODUCT_A", $v : validations)
    not (Validation(level == ValidationLevel.ERROR) from $v)
then
    log.info("Matching rule for {} with validations: {}", $p.getInsurer().getName(), $p.getValidations());
    $p.addValidation(new Validation(ValidationLevel.ERROR, "This insurance is not available for " + $p.getInsurer().getName()));
end
当我注入4个保单对象时,所有的保单对象都是针对产品_A的,一个保单对象的保险人名称是保险人_A,另外三个保单对象的其他名称,日志显示:

DroolsController - Matching rule for INSURER_B with validations: []
DroolsController - Matching rule for INSURER_C with validations: [Validation(id=0, level=ERROR, description=This insurance is not available for INSURER_B)]
DroolsController - Matching rule for INSURER_D with validations: [Validation(id=0, level=ERROR, description=This insurance is not available for INSURER_B), Validation(id=0, level=ERROR, description=This insurance is not available for INSURER_C)]
DroolsController - Matching rule for INSURER_B with validations: [Validation(id=0, level=ERROR, description=This insurance is not available for INSURER_D), Validation(id=0, level=ERROR, description=This insurance is not available for INSURER_B), Validation(id=0, level=ERROR, description=This insurance is not available for INSURER_C)]
DroolsController - Matching rule for INSURER_C with validations: [Validation(id=0, level=ERROR, description=This insurance is not available for INSURER_D), Validation(id=0, level=ERROR, description=This insurance is not available for INSURER_B), Validation(id=0, level=ERROR, description=This insurance is not available for INSURER_C)]
DroolsController - Matching rule for INSURER_D with validations: [Validation(id=0, level=ERROR, description=This insurance is not available for INSURER_D), Validation(id=0, level=ERROR, description=This insurance is not available for INSURER_B), Validation(id=0, level=ERROR, description=This insurance is not available for INSURER_C)]
我觉得这很奇怪。我希望在每一份保单上(保险公司除外)都有一个验证对象。但是,验证对象似乎已添加到所有策略对象中。当我读取结果时,每个验证对象都会添加到所有策略中,即使是在产品策略上


我的规则怎么了?如何更改规则以使其按预期运行?

这与定义的规则无关

您输入的策略事实是克隆对象。然而,这是一个浅层克隆而不是深层克隆。因此,策略对象中的验证列表仍然指向克隆中的相同验证列表

向一个对象添加验证时,由于其他对象引用了相同的列表,因此也会将其添加到其他对象


Drools首先创建一个包含所有条件的议程。当您修改对象时,它会发现该对象已更改,并相应地更新议程。但是,策略对象没有更改,因此即使引用的列表中有新的验证,规则也会运行。

如果不想多次执行规则,则可以从内存中“收回”事实。它将避免多次执行规则。

我确实希望规则执行多次,因为我正在向会话输入多个事实。当我收回这个事实时,我无法从会话中获取更新的信息,因为它已从工作内存中删除。