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