7

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

我读了这篇文章和其他一些文章。但我没有弄清楚。

4

2 回答 2

2

有状态会话 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();
}
于 2016-03-29T16:24:56.563 回答
1

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

有状态会话 bean 打包在 war 中并打包在 ear->jar 中时的意外行为

于 2014-01-31T21:58:10.190 回答