有状态会话和无状态会话之间的区别

时间:2019-05-17 09:08:52

标签: drools

在流口水中,无状态会话和有状态会话之间有什么区别?我浏览了其他文档并在下面找到了

无状态会话   执行规则时事实的任何更改都不会引起规则引擎的注意,因此,如果修改了任何规则,则不会进行其他任何规则的重新激活。

有状态会话     由于事实的任何更改都可用于规则引擎,因此,如果针对特定事实修改了规则,则此更改将重新激活所有规则并触发基于已修改事实的规则。

任何人都可以举例说明我的上述区别。

我试图执行以下规则并找到相同的结果

rule "first rules"
    when
        m : Message( status == Message.HELLO , myMessage : message )
    then
        System.out.println("first Rule");
        System.out.println( myMessage );


end

rule "second rules"
    when
        m : Message( status == Message.GOODBYE , myMessage : message )
    then
        System.out.println("second Rule");
        System.out.println( myMessage );


end

rule "third rules"
    when
       m : Message(  status == Message.GOODBYE , myMessage : message )
    then
        System.out.println( "third Rule" );
        System.out.println( myMessage );

        m.setMessage( "Hello " );
        m.setStatus( Message.HELLO );
       update(m);


end

1 个答案:

答案 0 :(得分:0)

您可以参考drools documentation来了解无状态和有状态的亲密关系之间的区别。通过示例进行解释。

无状态KieSession-:无状态KIE会话是没有推断的会话。可以像调用函数一样调用无状态会话,因为您可以使用它来传递数据,然后将结果接收回来。

它不支持Java代码中的fireAllRules()。无状态KieSession的execute方法将在内部实例化KieSession,添加所有用户数据并执行用户命令,调用fireAllRules(),然后调用dispose()。因此,每次调用execute时,都会重新实例化KieSession,再次插入用户数据,激发规则并再次调用dispose方法。

例如--

kStatelessSession.execute(isertObject);
kStatelessSession.execute(isertObjectAgain);

有状态的KieSession-:有状态的会话允许您随着时间的推移对事实进行迭代更改。因此,在kieSession有效之前,插入到KieSession的事实将一直可用。

对于例如-

kStatefulSession.insert(object1);
kStatefulSession.insert(object2);
kStatefulSession.insert(object3);
kStatefulSession.fireAllRules();
kStatefulSession.insert(object4);
kStatefulSession.insert(object5);
kStatefulSession.fireAllRules();

即使在第二次调用fireAllrules()时,此处的object1,object2,object3也将在会话中可用。试用文档“ stateful_kie_session”部分中提到的示例。您将了解其中的区别。