当事实不再匹配时,从Drools获得一些事件

时间:2017-08-18 19:12:16

标签: drools drools-flow

请查看下面的两个代码设置。

设置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生成任何事件(规则被解雇一次,但现在因为事实已更新而不再被解雇?)这样我可以区分:规则没有被解雇因为事实没有改变它没有被解雇,因为现在事实与规则条件不匹配?

1 个答案:

答案 0 :(得分:0)

你无法确定为什么规则没有列入议程。

你知道什么时候更新一个事实,所以如果由于某种原因这个有趣,请在事实或其他地方注册。

并且不要,重复:不要,在同一会话上的另一个此类调用仍在执行时调用fireAllRules。可能会有各种意想不到的影响。