首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Drools BRMS火灾和报警规则使用状态会话时不按预期工作

Drools BRMS火灾和报警规则使用状态会话时不按预期工作
EN

Stack Overflow用户
提问于 2017-03-11 10:28:21
回答 1查看 140关注 0票数 0

我正在尝试从drools文档中执行火、冲刺和报警规则。

我正在使用drools 6.5运行时,当我使用statefull会话(KIE会话)执行这个示例时,我可以看到下面的输出,它与文档中提到的输出不同。

下面是我在工作内存输出中插入洒水器和Fire时所看到的输出:

一切都很好,报警

根据文件,实际产出如下:

一切都好,报警,打开厨房的洒水器,打开房间办公室的喷头

感谢任何帮助我找出为什么我的另外两条规则不被解雇。

附加源代码:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-03-11 20:17:14

我有办法了。Fire对象的构造函数为空。

代码语言:javascript
运行
复制
public Fire(Room room2) {
    // TODO Auto-generated constructor stub
}

我修好了。

代码语言:javascript
运行
复制
public Fire(Room room2) {
    this.room =  room2 ;
}

而且起作用了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42734056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档