0

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

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

4

1 回答 1

0

您无法确定为什么没有将规则提上议事日程。

您知道何时更新事实,因此如果出于某种原因这很有趣,请将其注册到事实或其他地方。

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

于 2017-08-18T19:32:03.357 回答