请看下面的两个代码设置。
设置 1:
public class DroolsAnotherTest {
private static KieSession kSession;
private static Building building;
private static FactHandle buildingFact;
public static final void main(String[] args) {
try {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
kSession = kContainer.newKieSession("ksession-rules");
building = new Building();
building.setRooms(2);
buildingFact = kSession.insert(building);
kSession.fireAllRules();
} catch (Throwable t) {
t.printStackTrace();
}
}
public static void fireAgain(){
System.out.println("inside fireAgain method");
kSession.fireAllRules(); // firing the rules second time
}
public static class Building {
public int rooms;
public int getRooms() {
return this.rooms;
}
public void setRooms(int rooms) {
this.rooms = rooms;
}
}
}
和 .drl 文件
package com.sample
import com.sample.DroolsAnotherTest.Building;
import com.sample.DroolsAnotherTest;
rule "Building"
when
Building( rooms <3 )
then
System.out.println( "Building rule fired" );
DroolsAnotherTest.firingAgain();
end
运行后,输出为: 已触发构建规则
内部 fireAgain 方法
设置 2:这里我只是将 fireAgain() 方法更改为:
public static void fireAgain(){
System.out.println("inside fireAgain method");
kSession.delete(buildingFact);
building.setRooms(4);
kSession.insert(building);
kSession.fireAllRules(); // firing the rule second time
}
其他一切都是一样的。运行后,输出再次相同: 已触发构建规则
内部 fireAgain 方法
据我了解,
在设置 1 中,规则没有被第二次触发,因为事实在工作记忆中没有改变。
在设置 2 中,规则没有被第二次触发,因为现在事实已经更新并且它与规则条件不匹配。
我的问题是,Drools 是否为设置 2 生成任何事件(规则被触发一次但现在因为事实已经更新而不再被触发?)这样我可以区分:规则没有被触发,因为事实没有改变和它没有被解雇,因为现在事实与规则条件不符?