[英]Drools BRMS Fire and Alarm rule not working as expected using statefulsession
我正在嘗試執行Drools文檔中的火災,灑水和警報規則。
我正在使用drools 6.5運行時,當我使用statefull會話(KIE會話)執行此示例時,我可以看到以下輸出,該輸出與文檔中提到的輸出不同。
以下是我在工作內存輸出中插入自動噴水滅火時看到的輸出:
一切都很好發出警報
根據文檔的實際輸出為:
一切正常發出警報開啟房間廚房的灑水裝置開啟房間辦公室的灑水裝置
感謝任何幫助,以找出為什么我沒有其他兩個規則被解雇的原因。
附加源代碼:
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
我已經解決了。 Fire
對象的構造函數為空。
public Fire(Room room2) {
// TODO Auto-generated constructor stub
}
我修好了它 。
public Fire(Room room2) {
this.room = room2 ;
}
而且有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.