当前位置: 首页 > 知识库问答 >
问题:

Drools BRMS火灾和报警规则未按预期使用状态实现会话

楚元章
2023-03-14

我试图执行消防,短跑和报警规则从留档口水。

我正在使用drools 6.5运行时,当我使用状态完整会话(KIE会话)执行此示例时,我可以看到下面的输出与留档中提到的输出不同。

下面是我在工作内存中插入Spreader and Fire时看到的输出,我看到的输出是:

一切正常报警

留档的实际输出是:

一切正常,报警打开房间厨房的喷水器打开房间办公室的喷水器

感谢您能帮我弄清楚为什么其他两条规则没有被解雇。

附加源代码:

package com.company.license

import com.sample.dto.*

rule "When there is a fire turn on the sprinkler"
when
    Fire($room : room)
    $sprinkler : Sprinkler( room == $room, on == false )
then
    modify( $sprinkler ) { setOn( true ) };
    System.out.println( "Turn on the sprinkler for room " + $room.getName() );
end

rule "When the fire is gone turn off the sprinkler"
when
    $room : Room( )
    $sprinkler : Sprinkler( room == $room, on == true )
    not Fire( room == $room )
then
    modify( $sprinkler ) { setOn( false ) };
    System.out.println( "Turn off the sprinkler for room " + $room.getName() );
end

rule "Raise the alarm when we have one or more fires"
when
    exists Fire()
then
    insert( new Alarm() );
    System.out.println( "Raise the alarm" );
end

rule "Cancel the alarm when all the fires have gone"
when
    not Fire()
    $alarm : Alarm()
then
    retract( $alarm );
    System.out.println( "Cancel the alarm" );
end


rule "Status output when things are ok"
when
    not Alarm()
    not Sprinkler( on == true )
then
    System.out.println( "Everything is ok" );
end



package com.sample.dto;

public class Alarm {

}

package com.sample.dto;

public class Fire {
    private Room room;

    public Fire(Room room2) {
        // TODO Auto-generated constructor stub
    }

    public Room getRoom() {
        return room;
    }

    public void setRoom(Room room) {
        this.room = room;
    }
}

package com.sample.dto;

public class Room {
    private String name;


    public Room(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

package com.sample.dto;

public class Sprinkler {
    private Room room;
    private boolean on;

    public Sprinkler(Room room) {
        // TODO Auto-generated constructor stub
        this.room = room;
    }
    public Room getRoom() {
        return room;
    }
    public void setRoom(Room room) {
        this.room = room;
    }
    public boolean isOn() {
        return on;
    }
    public void setOn(boolean on) {
        this.on = on;
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="rules" packages="rules">
        <ksession name="ksession-rules"/>
        <ksession name="statelesssession" type="stateless" default="true"/>
    </kbase>
    <kbase name="dtables" packages="dtables">
        <ksession name="ksession-dtables"/>
    </kbase>
    <kbase name="process" packages="process">
        <ksession name="ksession-process"/>
    </kbase>
</kmodule>

public class FireAlarmStateful {

    public static final void main(String[] args) {
        try {
            // load up the knowledge base
            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            KieSession ksession = kContainer.newKieSession("ksession-rules");

            String[] names = new String[]{"kitchen", "bedroom", "office", "livingroom"};
            Map<String,Room> name2room = new HashMap<String,Room>();
            Room kitchen =  new Room("kitchen");
            Room office =  new Room("office");
            ksession.insert( kitchen );
            ksession.insert( office );
            Sprinkler sprinkler1 = new Sprinkler( kitchen);
            Sprinkler sprinkler2 = new Sprinkler( office);
            ksession.insert( sprinkler1 );
            ksession.insert( sprinkler2 );
            ksession.fireAllRules();

            Fire kitchenFire = new Fire( kitchen );
            Fire officeFire = new Fire( office );
            FactHandle kitchenFireHandle = ksession.insert( kitchenFire );
            FactHandle officeFireHandle = ksession.insert( officeFire );
            ksession.fireAllRules();

            ksession.dispose();

        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}


Output I get is : 
Everything is ok
Raise the alarm

Output mentioned in the Drools Documentation:
Everything is ok 
Raise the alarm 
Turn on the sprinkler for room kitchen 
Turn on the sprinkler for room office

共有1个答案

程俊健
2023-03-14

我有一个补丁。火灾对象的构造函数为空。

public Fire(Room room2) {
    // TODO Auto-generated constructor stub
}

我修好了。

public Fire(Room room2) {
    this.room =  room2 ;
}

它奏效了。

 类似资料:
  • 我正在制作一个应用程序,让用户选择几天,并在这些天的特定时间启动警报。 让我们以我的问题为例,我希望我的闹钟在每周五12:30触发,问题是它从来没有触发过闹钟,即使我在同一天,这是我的代码

  • 有没有一种方法可以通过使用集合名称变量来概括它

  • 例如,当我进入登录页面时...sessionCreated-将一个会话添加到计数器:1 然后,当我点击log out按钮时,会话计数减少了1(这很好),但紧接着会话计数增加了1(不是预期的)。 例如,当我按下注销按钮时...sessionDestroyed-从计数器0中扣除一个会话sessionCreated-将一个会话添加到计数器1中 我再次需要帮助来理解请。 这是我的Spring安全设置...

  • Flink中的会话窗口在prod env上没有按预期工作(相同的逻辑在本地env上工作)。这个想法是为特定的用户ID发出“sample_event_two”的计数 尽管集合中存在sample_event_one(通过验证日志消息“已接收sample_event_one”是否存在来确认)并且计数计算正确,但我没有看到任何输出事件被创建。我看到日志消息“未找到 sampleOneEvent 事件,而不

  • 1)对于上面的代码,如果LogSearchRemote实现bean是有状态的,那么 没有错误,但是如果LogSearchRemote实现bean是无状态的,那么会抛出异常“$Proxy53不能强制转换为hk.gov.ehr.service.tch.als.admin.logsearch.ejb.LogSearchRemote”,为什么? 2)对于有状态会话bean,每次 返回不同的logSearc

  • 下面是C 17形式的规则([basic.lval]/8),但它在其他标准中看起来很相似(C 98中是“lvalue”而不是“glvalue”): 8如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义: (8.4)-对应于对象动态类型的有符号或无符号类型 这条规则听起来像是“除非你做X,否则你会得到UB”,但这并不意味着如果你做了X,你就不会得到UB,正如人们所期望的那样