在流口水中,无状态会话和有状态会话之间有什么区别?我浏览了其他文档并在下面找到了
无状态会话 执行规则时事实的任何更改都不会引起规则引擎的注意,因此,如果修改了任何规则,则不会进行其他任何规则的重新激活。
有状态会话 由于事实的任何更改都可用于规则引擎,因此,如果针对特定事实修改了规则,则此更改将重新激活所有规则并触发基于已修改事实的规则。
任何人都可以举例说明我的上述区别。
我试图执行以下规则并找到相同的结果
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
答案 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”部分中提到的示例。您将了解其中的区别。