来自同一包但不同kbase的Drools规则在测试中执行,尽管它们不应

时间:2019-06-03 09:18:37

标签: drools

我有两个kbase,每个kbase都引用相同的程序包,但是使用不同的drools规则模板(.drt)。每个.drt文件都引用相同的.xls文件。当我分别运行测试时,一切都很好。但是,当我一次运行整个测试时,来自同一包的其他.drt文件的规则将被激活。如果从未使用过规则,则不会激活它。一旦使用了规则,它将在其他不应该使用的会话中激活。

我试图将所有内容分离到不同的程序包中,但效果很好。但是我不想重复xls,因为它不会被技术过硬的用户修改。

这是kmodule

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <kbase name="prsGrass" default="false" eventProcessingMode="stream"
           packages="prsGrass, autograder">                    
        <ruleTemplate dtable="com/esteam8/nikolay/expert/equipment/autograder/autograders.xls"
                      template="com/esteam8/nikolay/expert/equipment/autograder/soilExcavation/soilExcavation.drt"
                      row="6" col="1"/>
        <ruleTemplate dtable="com/esteam8/nikolay/expert/equipment/autograder/autograders.xls"
                      template="com/esteam8/nikolay/expert/equipment/autograder/soilExcavation/setExcavationSoilCoef.drt"
                      row="13" col="26"/>                                                                                                                               
        <ksession name="prsGrassCutKS" type="stateful" default="false"/>
    </kbase> 

    <kbase name="autograderLeveling" default="false" eventProcessingMode="stream"
           packages="autograder, expert">
        <ruleTemplate dtable="com/esteam8/nikolay/expert/equipment/autograder/autograders.xls"
                      template="com/esteam8/nikolay/expert/equipment/autograder/leveling.drt"
                      row="6" col="1"/>
        <ruleTemplate dtable="com/esteam8/nikolay/expert/equipment/autograder/autograders.xls"
                      template="com/esteam8/nikolay/expert/equipment/autograder/setSoilCoef.drt"
                      row="6" col="26"/>                                                                                                                                     
        <ksession name="autograderLevelingKS" type="stateful" default="false"/>
    </kbase>

</kmodule>

和测试

public class PavementTest {

    @Test
    public void prsGrassCutTest() {
        KieSession session = Expert.create("prsGrassCutKS")
            .work("XX-XXXX-X9", "природно-растительный слой срезка", "1", "m^2")
            .parameter("SOIL-GROUP", "3")
            .and()
            .build();

        session.fireAllRules();

        session.dispose();
        System.out.println("###################################################################################");
    }


    @Test
    public void autograderLevelingTest() {
        KieSession session = Expert.create("autograderLevelingKS")
            .work("XX-XXXX-X12", "Планировка площадей автогрейдером", "1", "m^2")
            .parameter("SOIL-GROUP", "3")
            .and()
            .build();

        session.fireAllRules();
        session.dispose();
        System.out.println("###################################################################################");
    }

}

这是来自控制台的结果

Soil Excavation
LABOR, Машинист автогрейдера (Разряд 8), E1, Soil1
EQUIPMENT, Автогрейдер XCMG GR215, Soil1, null
AUTOGRADERS, Soil2, Soil1
###################################################################################
Leveling
LABOR, Машинист автогрейдера (Разряд 8), E1, Soil1
LABOR, Машинист автогрейдера (Разряд 8), E1, Soil1
EQUIPMENT, Автогрейдер XCMG GR215, Soil1, null
AUTOGRADERS, Leveling2, Soil1
AUTOGRADERS, Soil2, Soil1
###################################################################################

在控制台中,您可以注意到在第二个测试中有两个AUTOGRADERSLABOR。应该只有一个。另外,那些AUTOGRADERS应该没有与土壤有关的任何东西,因为它正在找平工作。在第二个测试中,带有“ soil”规则的.drt通过“ leveling” .drt激活了规则。因此,两个.drts重叠了。

这里是github仓库,供那些想重现示例的人使用 https://github.com/Kusbek/myProject

0 个答案:

没有答案