High CPU due to RichFaces concurrent access to the request attributes HashMap

Solution Verified - Updated

Environment

  • JBoss Enterprise Application Platform (EAP)
  • Richfaces

Issue

  • High CPU.
  • The threads using CPU have the following stack trace:
    http-10.20.81.200-17180-11" daemon prio=10 tid=0x0000002bbdd01c00 nid=0x19be runnable [0x0000000048db3000..0x0000000048db5ab0]
       java.lang.Thread.State: RUNNABLE
         at java.util.HashMap.get(HashMap.java:305)
         at org.apache.catalina.connector.Request.getAttribute(Request.java:878)
         at org.apache.catalina.connector.RequestFacade.getAttribute(RequestFacade.java:263)
         at javax.servlet.ServletRequestWrapper.getAttribute(ServletRequestWrapper.java:82)
         at com.sun.faces.context.RequestMap.put(ExternalContextImpl.java:1086)
         at org.ajax4jsf.event.AjaxPhaseListener.afterPhase(AjaxPhaseListener.java:81)
         at com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:175)
         at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:114)
         at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:104)
         at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
         at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
         at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:286)
         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
         at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
         at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
         at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
         at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
         ...
    

Resolution

Use a single a4j:queue to queue ajax requests.

Root Cause

See High CPU due to multiple Java threads accessing HashMap simultaneously.

Diagnostic Steps

Components

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.