我有一个@ViewScopedbean,它有一个带@PreDestroy注释的方法,可以确保关闭一些远程连接.但是,当用户导航时不调用该方法.
有什么可以做错的吗?我是否必须在任何地方注册任何内容才能使其正常工作?
这是一个简单的公共方法(void),不会抛出任何异常.
我正在使用带有Tomcat 7.0.12的JSF 2(MyFaces).这可能是Tomcat的问题吗?
UPDATE
在@PostConstruct注释工作正常.
所述的生命周期 @RequestScoped和@SessionScopedBean 管理豆由Servlet容器自身管理,因为它们是基本上作为一个属性存储HttpRequest和HttpSession分别.JSF如何管理生命周期@ViewScopedBean?我知道它是在创建视图时创建的,并且可以使用,直到有回发到另一个视图.但是我发现在我们离开那个视图后不会立即收集垃圾.
在我们 在JBoss 7.1.1上的JavaEE6项目(EJB3,JSF2)中,似乎我们有SeamFaces的内存泄漏.@ViewScoped
我们制作了一个小原型来检查这个事实:
在测试结束时,我们使用VisualVM检查内存的内容,这里我们得到了:
@ViewScopedbean,我们仍然可以获得200个有状态实例MyController- 并且该@PreDestroy方法永远不会被调用;@ConversationScopedbean,@preDestroy方法称为会话结束,然后我们得到一个干净的内存.我们是否严重使用视图范围,还是真的是一个错误?
这是XHTML页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:s="http://jboss.org/seam/faces">
<f:metadata>
<f:viewParam name="u" value="#{myBean.uselessParam}" />
<s:viewAction action="#{myBean.callService}" />
</f:metadata>
<h:body >
<f:view>
</f:view>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
现在包含的bean myBean.对于@ConversationScoped变体,所有注释的部分都是未注释的.
@ViewScoped
// @ConversationScoped
@Named
public class MyBean implements Serializable
{
@Inject
MyController myController; …Run Code Online (Sandbox Code Playgroud) 我的问题与此(或其他)有关:
如此处所述,没有简单的解决方案来解决在导航时销毁视图范围的Bean的问题,并且在会话期满时似乎也是如此。
释放(调用该@PreDestroy方法)JSF视图范围的Bean 的非平凡方法会是什么样子,或者更确切地说,是会话期满后立即释放?
我在GlassFish 3.1.2上使用Java EE 6和Mojarra2.1.x。
jsf-2 ×4
jsf ×3
view-scope ×3
annotations ×1
cdi ×1
destroy ×1
glassfish ×1
java-ee ×1
javabeans ×1
managed-bean ×1
memory-leaks ×1
seam3 ×1