繁体   English   中英

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

[英]Getting some event from Drools when the fact does not match anymore

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

设置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

运行后,输出为:已触发构建规则

内火再次使用方法


设置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
}

其他一切都一样。 运行后,输出再次相同:已触发构建规则

内火再次使用方法


据我了解,

在设置1中,该规则没有第二次被触发,因为事实在工作存储器中没有发生变化。

在设置2中,该规则没有第二次被触发,因为现在事实已更新并且与规则条件不匹配。

我的问题是,Drools是否会为设置2生成任何事件(规则被触发一次,但由于事实已更新而现在不再触发?)以这种方式我可以区分:规则没有被触发,因为事实未更改, 并且它没有被解雇,因为现在事实与规则条件不匹配?

您无法确定为什么未将规则列入议程。

您知道何时更新事实,因此,如果出于某种原因对此很感兴趣,请在事实或其他地方进行注册。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM