【问题标题】:When is the stateful session bean destroyed?有状态会话 bean 何时被销毁?
【发布时间】:2014-01-30 14:54:55
【问题描述】:

我是 ejbs 的新手,我想知道有状态会话 bean 是否会被销毁。我在我的 servlet 中注入了一个有状态会话 bean。即使在 30 分钟后,我也看到 bean 处于活动状态。我正在使用 jboss eap 6.0。我相信 HttpSession 与有状态会话 bean 无关。我使 HttpSession 无效以确保 HttpSession 与静态会话 bean 无关。那么,如果我的应用程序有很多用户,如果我为每个用户创建一个新 bean,我的服务器的性能就会下降。容器如何管理有状态会话 bean。 bean 何时被移除或销毁?

我阅读了this 的帖子和其他一些帖子。但我没有搞清楚。

【问题讨论】:

  • 查看 Oracle Java EE 7 tutorial。他们有一个有状态会话 bean 的示例。如果您想构建一个可扩展的应用程序,请远离有状态的服务器代码,而是让客户端维护所有状态。
  • 谢谢你,这有帮助。 When the client terminates, its session bean appears to terminate and is no longer associated with the client.我关闭并打开浏览器并发送相同的请求,我可以看到有状态 bean 不再存在。
  • 这仍然不能准确地回答我它是如何工作的。我知道让有状态 bean 保持活动状态的是客户端,但是与浏览器相关的是如何工作的呢?我假设您将 EJB 会话设置为范围?
  • 是的,ejb 是会话范围的。我认为应用服务器将维护某种时间戳、浏览器详细信息和其他东西来确定会话。

标签: java ejb-3.0 java-ee-6 stateful-session-bean


【解决方案1】:

Stateful Session Bean 不是客户端上下文化的,必须在您的代码中显式销毁。

1) SFSB 必须定义一个由@Remove 注释的方法:

@Stateful
@Local(ILocalQuiz.class)
public class QuizBean implements ILocalQuiz{

//...

    @Remove
    @Override
    public void end() {
        System.out.println("QuizBean instance will be removed..");
    }

}

2) SessionScoped bean 必须显式调用end() 方法:

public void cleanUp(){
    System.out.println("Cleaning up before destroying the SessionScoped  bean.");
    quizProxy.end();
}

【讨论】:

    【解决方案2】:

    @SessionScoped 注释仅在 web 上下文中有意义,在 web 上下文之外,您应该假设您的 @SessionScoped 将被忽略,而您的有状态 EJB 将表现得像一个旧的常规有状态 ejb,您不应该将有状态资源(旧的常规有状态 EJB)注入无状态资源(Servlet),在这种情况下,有状态 ejb 的范围将取决于 servlet 实例的范围和 java servlet 规范。并不严格要求容器为每个会话或请求创建一个 servlet 实例,事实上,某些容器将使用您的 servlet 的单个实例来服务所有客户端,在这种情况下,您最终会遇到这种丑陋的情况一个有状态的 ejb 实例将为您的所有客户端提供服务,检查一下,

    Stateful session beans unexpected behaviour when packaged in a war and packaged in an ear->jar

    【讨论】:

      猜你喜欢
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多