我有两个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
###################################################################################
在控制台中,您可以注意到在第二个测试中有两个AUTOGRADERS
和LABOR
。应该只有一个。另外,那些AUTOGRADERS应该没有与土壤有关的任何东西,因为它正在找平工作。在第二个测试中,带有“ soil”规则的.drt通过“ leveling” .drt激活了规则。因此,两个.drts重叠了。
这里是github仓库,供那些想重现示例的人使用 https://github.com/Kusbek/myProject