请查看下面的两个代码设置。
设置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生成任何事件(规则被解雇一次,但现在因为事实已更新而不再被解雇?)这样我可以区分:规则没有被解雇因为事实没有改变和它没有被解雇,因为现在事实与规则条件不匹配?
答案 0 :(得分:0)
你无法确定为什么规则没有列入议程。
你知道什么时候更新一个事实,所以如果由于某种原因这个有趣,请在事实或其他地方注册。
并且不要,重复:不要,在同一会话上的另一个此类调用仍在执行时调用fireAllRules。可能会有各种意想不到的影响。