drools实现有状态session和无状态session
无状态session
无状态的KIE会话是一个不使用推理来对事实进行反复修改的会话。在无状态的KIE会话中,来自KIE会话先前调用的数据(先前的会话状态)在会话调用之间被丢弃,而在有状态的KIE会话中,这些数据被保留。一个无状态的KIE会话的行为类似于一个函数,因为它产生的结果是由KIE基础的内容和被传入KIE会话以在特定时间点执行的数据决定的。KIE会话对以前传入KIE会话的任何数据都没有记忆。
使用方法类似如下代码:
@Test
public void testStatelessSession() {
StatelessKieSession statelessKieSession = kieBase.newStatelessKieSession();
List cmds = new ArrayList<>();
KieSessionEntity kieSessionEntity = new KieSessionEntity();
kieSessionEntity.setNum(10);
kieSessionEntity.setValid(false);
cmds.add(CommandFactory.newInsert(kieSessionEntity, "kieSessionEntity"));
statelessKieSession.execute(CommandFactory.newBatchExecution(cmds));
System.out.println(kieSessionEntity);
}
简单说来,无状态session执行的时候,不需要调用 fireAllRules(),也不需要执行dispose(),代码执行完execute之后,即销毁所有的数据。
使用场景:比如上述的校验num
验证数据: 比如计算积分,按揭房贷等
路有消息:比如对邮件排序,发送邮件等,行为类的场景
有状态session
有状态的KIE会话是一个使用推理来对事实进行反复修改的会话。在有状态的KIE会话中,来自KIE会话先前调用的数据(先前的会话状态)在会话调用之间被保留,而在无状态的KIE会话中,这些数据被丢弃了。
对比无状态session,有状态session调用fireAllRules()的时候采取匹配规则,就会执行规则匹配,除非遇见dispose()
示例:
数据模型:
public class Room {
private String name;
// Getter and setter methods
}
public class Sprinkler {
private Room room;
private boolean on;
// Getter and setter methods
}
public class Fire {
private Room room;
// Getter and setter methods
}
public class Alarm {
}
规则文件:
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 "Raise the alarm when we have one or more fires"
when
exists Fire() theninsert( new Alarm() );
System.out.println( "Raise the alarm" );
end
rule "Cancel the alarm when all the fires have gone"
when
not Fire() $alarm : Alarm() thendelete( $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
代码:
KieSession ksession = kContainer.newKieSession();
String[] names = new String[]{"kitchen", "bedroom", "office", "livingroom"};
Map name2room = new HashMap();
for(String name:names ){
Room room = new Room(name);
name2room.put(name, room);
ksession.insert(room);
Sprinkler sprinkler = new Sprinkler(room);
ksession.insert(sprinkler);
}
ksession.fireAllRules();
输出:
此时还可以继续输入
Fire kitchenFire = new Fire( name2room.get( "kitchen" ) );
Fire officeFire = new Fire( name2room.get( "office" ) );
FactHandle kitchenFireHandle = ksession.insert( kitchenFire );
FactHandle officeFireHandle = ksession.insert( officeFire );
ksession.fireAllRules();
继续输入
ksession.delete( kitchenFireHandle );
ksession.delete( officeFireHandle );
ksession.fireAllRules();
使用场景:
1、监测,如监测股票市场并使购买过程自动化。
2、诊断,如运行故障查找过程或医疗诊断过程。
3、物流,如包裹跟踪和配送供应。
4、确保合规性,如验证市场交易的合法性。
正文到此结束
- 本文标签: drools 规则引擎 session
- 本文链接: http://www.ysxbohui.com/article/310
- 版权声明: 本文由狂奔的程序猿原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权