【问题标题】:Stuck thread at UIComponent.popComponentFromEL卡在 UIComponent.popComponentFromEL 的线程
【发布时间】:2015-07-17 14:19:02
【问题描述】:

我的应用程序使用带有 PrimeFaces 的 JSF 2.1。最近,由于一些卡住的线程,观察到非常高的 CPU 使用率。所有卡住线程的卡住线程转储指向javax.faces.component.UIComponent.popComponentFromEL,如下所示:

javax.faces.component.UIComponent.popComponentFromEL(UIComponent.java:1934)
javax.faces.component.UIComponent.visitTree(UIComponent.java:1633)
javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
org.primefaces.component.api.UIData.visitRows(UIData.java:741)
org.primefaces.component.api.UIData.visitTree(UIData.java:656)
javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
org.primefaces.component.accordionpanel.AccordionPanel.visitTree(AccordionPanel.java:371)
javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
javax.faces.component.UIForm.visitTree(UIForm.java:371)
javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
javax.faces.component.UIComponent.visitTree(UIComponent.java:1623)
com.sun.faces.application.view.StateManagementStrategyImpl.findComponent(StateManagementStrategyImpl.java:440)
com.sun.faces.application.view.StateManagementStrategyImpl.restoreDynamicRemove(StateManagementStrategyImpl.java:412)
com.sun.faces.application.view.StateManagementStrategyImpl.restoreDynamicActions(StateManagementStrategyImpl.java:317)
com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:281)
com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:188)
com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123)
com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:453)
com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:142)
com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:192)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:77)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
com.ultimatix.bgc.framework.GBGCSessionControllerFilter.doFilter(GBGCSessionControllerFilter.java:90)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
com.ultimatix.framework.jsf.util.ForcedLoginFilter.doFilter(ForcedLoginFilter.java:505)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
com.ultimatix.framework.jsf.util.IndexFilter.doFilter(IndexFilter.java:338)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
com.ultimatix.framework.jsf.util.SecurityInterceptor.doFilter(SecurityInterceptor.java:40)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
weblogic.work.ExecuteThread.execute(ExecuteThread.java:207)
weblogic.work.ExecuteThread.run(ExecuteThread.java:176)

这是怎么引起的,我该如何解决?

【问题讨论】:

  • 你想达到什么目的?一些代码?
  • 真正的问题可能是调用: UIComponent.popComponentFromEL ...这似乎永远不会返回。
  • 你忘了告诉版本。您应该知道版本信息对于根据堆栈跟踪中的行号查找正确的源代码行非常重要。无论如何,您是否尝试过最新版本只是为了查看它是否尚未在较新版本中修复?
  • 我正在使用 primefaces3.4.2、jsf-api-2.1.7 和 jsf-impl-2.1.7
  • 那些都是旧的。至少尝试最新的 jsf 2.1.x

标签: multithreading jsf jsf-2 primefaces components


【解决方案1】:

根据 Mojarra issue 2722,当您错误地将组件实例绑定到不受请求范围但在更广泛范围内的托管 bean 的 bean 属性时,就会发生这种情况。

<x:someComponent binding="#{viewOrSessionOrApplicationScopedBean.component}" />

相应地修复代码,使这种情况永远不会发生。组件本质上是请求范围的,绝对不能在多个请求之间共享。另见JSF 2.0 specitication 第 3.1.5 章:

3.1.5 组件绑定

...

组件绑定通常与通过 Managed 动态实例化的 JavaBean 结合使用 Bean 创建工具(请参见第 5.8.1 节“VariableResolver 和默认的 VariableResolver”)。 强烈 建议应用程序开发人员将组件绑定表达式指向的托管 bean 放在 “请求”范围。 这是因为将其置于会话或应用程序范围内需要线程安全,因为 UIComponent 实例依赖于在单个线程内运行。也有潜在的负面影响 将组件绑定放在“会话”范围内时的内存管理。

另见:

【讨论】:

  • 我们遇到了问题,但我们没有在代码中使用任何绑定。环境详情:weblogic 12.1.3.0、Liferay 6.2 EE、Primefaces 5.1、Jsf Mojarra 2.2.14。这发生在重负载下(运行安全扫描时)。任何帮助将不胜感激。
  • @BalusC,我如何在应用程序级别(页面/组件)跟踪/记录该线程卡住的组件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多