Drools同时更新同一个对象

时间:2013-11-30 07:06:05

标签: drools

我有两个.drl文件:

.dlr文件一

rule "Lower Elementary Level"
    no-loop

    when
        $m: MockBean ( overAllScore >= 40.51 && overAllScore < 60.76 )
        $s : StudentMockBean()
    then
        $s.setKnowledgeLevel( "Lower Elementary Level" );
        update( $s );
end

// some other condition

.drl文件二

rule "Concept Lower Elementary Level"
    no-loop

    when
        $m: MockBean ( mockOneScore >= 40.51 && mockOneScore < 60.76 )
        $s : StudentMockBean()
    then
        $s.setMockOneKnowledgeLevel( "Lower Elementary Level" );
        update( $s );
end

// some other condition

我正在读这两个:

...
for( String fileName : aRuleFileName )
{
     kbuilder.add( ResourceFactory.newClassPathResource( fileName, getClass() ), ResourceType.DRL );
}

// get error

KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

return kbase;

我解除了两条规则, .drl 文件都符合条件,但是他们正在更新同一个对象。

我的问题是为什么我的网络应用会无限加载?

1 个答案:

答案 0 :(得分:2)

您的规则组合导致无限循环。 即rule A activates -> rule A fires -> modifies $s -> rule B activates -> rule B fires -> modifies $s -> rule A activates -> rule A fires -> modifies $s -> rule B activates -> rule B fires -> ...

no-loop对于这种情况来说还不够。 如需更好地解释正在发生的事情以及解决问题的可能方法,请阅读this blog entry

希望它有所帮助,