Пожалуйста, взгляните на две настройки кода ниже.
Настройка 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 (правило срабатывает один раз, но теперь не срабатывает снова, потому что факт обновлен?) Таким образом, я могу различать: правило не сработало, потому что факт не изменился < strong>и его не уволили, потому что теперь факт не соответствует условию правила?