何时有状态会话bean被销毁?

时间:2014-01-30 14:54:56

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

我是ejbs的新手,我想知道有状态会话bean是否会被销毁。我在servlet中注入了一个有状态会话bean。即使在30分钟后,我发现豆子是活跃的。我正在使用jboss eap 6.0。我相信HttpSession与有状态会话bean无关。我使HttpSession失效,以确保HttpSession与statful会话bean无关。那么,如果我的应用程序有很多用户,如果我创建一个新bean,那么我的服务器的性能就会降低。容器如何管理有状态会话bean。豆被移除或销毁的时间是什么时候?

我看了this帖子和其他一些帖子。但我没有明白。

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

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

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