原创

drools实现有状态session和无状态session

无状态session
无状态的KIE会话是一个不使用推理来对事实进行反复修改的会话。在无状态的KIE会话中,来自KIE会话先前调用的数据(先前的会话状态)在会话调用之间被丢弃,而在有状态的KIE会话中,这些数据被保留。一个无状态的KIE会话的行为类似于一个函数,因为它产生的结果是由KIE基础的内容和被传入KIE会话以在特定时间点执行的数据决定的。KIE会话对以前传入KIE会话的任何数据都没有记忆。
使用方法类似如下代码:

   @Test
    public void testStatelessSession() {
        StatelessKieSession statelessKieSession = kieBase.newStatelessKieSession();
        List<Command> 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 
<br/>rule "Raise the alarm when we have one or more fires" 
when
    exists Fire() theninsert( new Alarm() ); 
    System.out.println( "Raise the alarm" ); 
end
<br/>rule "Cancel the alarm when all the fires have gone" 
when
    not Fire() $alarm : Alarm() thendelete( $alarm ); 
    System.out.println( "Cancel the alarm" ); 
end 
<br/>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<String, Room> name2room = new HashMap<String, Room>();
    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、确保合规性,如验证市场交易的合法性。

本文链接地址:http://www.ysxbohui.com/article/310

正文到此结束