我正在尝试从drools文档中执行火、冲刺和报警规则。
我正在使用drools 6.5运行时,当我使用statefull会话(KIE会话)执行这个示例时,我可以看到下面的输出,它与文档中提到的输出不同。
下面是我在工作内存输出中插入洒水器和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发布于 2017-03-11 20:17:14
我有办法了。Fire对象的构造函数为空。
public Fire(Room room2) {
// TODO Auto-generated constructor stub
}我修好了。
public Fire(Room room2) {
this.room = room2 ;
}而且起作用了。
https://stackoverflow.com/questions/42734056
复制相似问题