当前位置: 首页 > 知识库问答 >
问题:

有状态会话与无状态会话的区别

边永贞
2023-03-14

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个答案

杜凯
2023-03-14

您可以参考drools文档来理解无状态和有状态Kiesession之间的区别。并举例说明。

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

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

kStatelessSession.execute(isertObject);
kStatelessSession.execute(isertObjectAgain);
kStatefulSession.insert(object1);
kStatefulSession.insert(object2);
kStatefulSession.insert(object3);
kStatefulSession.fireAllRules();
kStatefulSession.insert(object4);
kStatefulSession.insert(object5);
kStatefulSession.fireAllRules();

这里,object1、object2、object3即使在第二次调用fireAllrules()时也可以在会话中使用。尝试在文档的“stateful_kie_session”部分中提到的示例。你会明白区别的。

 类似资料:
  • 需要一些帮助!!我对Drools中的有状态和无状态会话没有清晰的理解。我正在努力理解这一点,所以尝试了一个例子。 我在drools6.5版本上使用有状态和无状态会话测试了下面的drl,在这两种情况下都得到了相同的输出。根据我对无状态会话的理解,它应该只执行第一条规则,当应用程序对象在第一条规则中被修改时,第二条规则不应该被激活(“有效期”)。附加源代码。感谢您在这方面的帮助。

  • 对于有状态会话bean(SFSB)和无状态会话bean(SLSB)的用法,我有点困惑。 我知道SFSB与客户保持状态。这很有帮助:什么时候使用有状态会话bean而不是无状态会话bean? 这里和许多其他地方提供的示例是SFSB的购物车。 “如果一个任务需要一系列方法调用(不止一次),并且您需要保留以前的结果以在下一次调用中使用它们,那么就可以使用SFSB”--Source。这将更像是签出(页面之间

  • 我是EJB的新手,最近开始研究EJB(3.0)。我已经使用Java6年了,但以前从未使用过EJB。至少可以说,整个EJB业务的复杂性让我不知所措。我不明白我可以在哪里实际应用一些概念。 在理解无状态会话bean后,我想到的一个问题是,你能不能不要总是用一个没有本地成员的类的共享实例来替换无状态会话bean(实际上使其无状态)?我了解到正在为无状态会话bean进行实例池。如果没有状态,就不能简单地使

  • 我对口水还不熟悉。我试图理解Drools提供的无状态会话和有状态会话之间的区别。 根据我的初步理解, 在无状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则不会将其重新提交给推理引擎以找出与修改后的事实匹配的新规则。 在状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则它将被重新提交给推理引擎以找出与修改后的事实相匹配的新规则,然后执行相应的操作。 因此,当我试图通过编写一

  • 问题内容: 有状态会话bean和HTTP会话之间有什么关系吗?我们将需要有状态会话Bean的用例是什么,而HTTP会话需要哪些用例。我可以将有状态会话Bean公开为静态Web服务吗? 问题答案: HTTP是一种无状态协议, 这意味着 它是服务器和客户端之间的实际传输协议- 是“无状态的, 因为它在调用之间不记得任何东西。 现在,首先阅读一下什么是HTTPSession和什么是Session Bea

  • 问题内容: 有状态会话Bean定义如下: 有状态会话Bean对象的状态由其实例变量的值组成。在有状态会话Bean中,实例变量代表唯一的客户端Bean会话的状态。因为客户端与其bean进行交互(“交谈”),所以这种状态通常称为对话状态。 无状态会话Bean定义如下: 无状态会话Bean无状态会话Bean不会与客户端保持对话状态。当客户端调用无状态Bean的方法时,该Bean的实例变量可能包含特定于该