Thanks Jakob for the analysis. But what is "another thread"? Do you know whether myFaces (or richfaces) starts another thread? I don't think that any other thrid party libs are involved here. Any instant ideas for this?
It's not a real problem so far because it occurred during a load test only. Michael Am 09.04.2010 11:57, schrieb Jakob Korherr:
Hi Michael, I just took a look at this problem and it seems to be one of tomcat. I also checked out the tomcat 6.0.24 branch to find the code that causes the exception. The main problem is that the request map is altered during it is processed with an Iterator in org.apache.catalina.util.Enumerator --> java.util.ConcurrentModificationException. Here is some code from tomcat that shows this conclusion: org.apache.catalina.connector.Request.getAttributeNames looks like this: public Enumeration getAttributeNames() { // cut for clarity return new Enumerator(attributes.keySet(), true); } So this code wants to create a new Enumerator with the keySet of the request attributes. It also tells the Enumerator to clone the keySet before generating the Iterator internally. The code that does the cloning can be found in org.apache.catalina.util.Enumerator: public Enumerator(Iterator iterator, boolean clone) { super(); if (!clone) { this.iterator = iterator; } else { List list = new ArrayList(); while (iterator.hasNext()) { list.add(iterator.next()); // line 101: this is the place where the ConcurrentModificationException happens } this.iterator = list.iterator(); } } So the constructor goes through the given Iterator (from the keySet of the request map) and creates an ArrayList out of it. The problem is now that if another thread alters the request map during this creation, you will get the ConcurrentModificationException. Of course, this is very rare and furthermore I guess the cloning was added to minimize the chance of a ConcurrentModificationException, but it still can happen. If you really want to eleminate this problem, thread synchronizing has to be introduced here. Regards, Jakob 2010/4/9 Michael Heinen<[email protected]>Hi, I found followoing exception a few times in my tomcat log after running a JMeter stresstest some hours with a few hundred users. Any ideas about a ConcurrentModificationException during RequestMap.getAttributeNames() ? [2010-04-07 09:00:59,653] http-8080-6 [ERROR] [6799FA3FDEBB49F294E54657DB099957] servlets.FacesServletWrapper service: Caught exception in the FacesServletWrapper: javax.servlet.ServletException: java.util.ConcurrentModificationException at javax.faces.webapp._ErrorPageWriter.throwException(_ErrorPageWriter.java:549) at javax.faces.webapp.FacesServlet.handleLifecycleException(FacesServlet.java:293) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:187) at com.foo.client.web.servlets.FacesServletWrapper.service(FacesServletWrapper.java:124) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206) 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) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:384) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.foo.client.web.filters.LoginFilter.doFilter(LoginFilter.java:183) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.foo.client.web.filters.EncodingFilter.doFilter(EncodingFilter.java:49) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.foo.client.web.filters.TimerFilter.doFilter(TimerFilter.java:71) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:465) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:619) Caused by: javax.faces.FacesException: java.util.ConcurrentModificationException at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:166) at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:293) at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:172) at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:293) at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:172) at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:293) at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:172) at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:293) at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:172) at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:293) at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:226) at org.ajax4jsf.component.AjaxViewRoot.processValidators(AjaxViewRoot.java:463) at org.apache.myfaces.lifecycle.ProcessValidationsExecutor.execute(ProcessValidationsExecutor.java:32) at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:103) at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:76) at org.apache.myfaces.custom.ppr.PPRLifecycleWrapper.execute(PPRLifecycleWrapper.java:68) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:178) ... 32 more Caused by: java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793) at java.util.HashMap$KeyIterator.next(HashMap.java:828) at org.apache.catalina.util.Enumerator.<init>(Enumerator.java:101) at org.apache.catalina.util.Enumerator.<init>(Enumerator.java:67) at org.apache.catalina.connector.Request.getAttributeNames(Request.java:962) at org.apache.catalina.connector.RequestFacade.getAttributeNames(RequestFacade.java:278) at org.apache.myfaces.context.servlet.RequestMap.getAttributeNames(RequestMap.java:66) at org.apache.myfaces.util.AbstractAttributeMap$AbstractAttributeIterator.<init>(AbstractAttributeMap.java:196) at org.apache.myfaces.util.AbstractAttributeMap$AbstractAttributeIterator.<init>(AbstractAttributeMap.java:194) at org.apache.myfaces.util.AbstractAttributeMap$KeyIterator.<init>(AbstractAttributeMap.java:224) at org.apache.myfaces.util.AbstractAttributeMap$KeyIterator.<init>(AbstractAttributeMap.java:224) at org.apache.myfaces.util.AbstractAttributeMap$KeySet.iterator(AbstractAttributeMap.java:177) at org.richfaces.component.ClonedObjectResolver.resolveCloned(ClonedObjectResolver.java:92) at org.richfaces.component.ClonedObjectResolver.getValue(ClonedObjectResolver.java:61) at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54) at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54) at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:140) at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:61) at org.apache.el.parser.AstValue.getValue(AstValue.java:107) at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101) at javax.faces.component._ComponentUtils.getExpressionValue(_ComponentUtils.java:236) at javax.faces.component.UIComponentBase.getExpressionValue(UIComponentBase.java:1176) at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:1251) at org.apache.myfaces.custom.htmlTag.AbstractHtmlTag.isRendered(AbstractHtmlTag.java:84) at org.apache.myfaces.custom.datalist.AbstractHtmlDataList.processChildren(AbstractHtmlDataList.java:149) at org.apache.myfaces.custom.datalist.AbstractHtmlDataList.processValidators(AbstractHtmlDataList.java:108) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:726) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:726) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:726) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:726) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:726) at javax.faces.component.UIForm.processValidators(UIForm.java:82) at org.ajax4jsf.component.AjaxViewRoot$3.invokeContextCallback(AjaxViewRoot.java:447) at org.ajax4jsf.component.ContextCallbackWrapper.invokeContextCallback(ContextCallbackWrapper.java:44) at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:163) ... 48 more I do not start a new thread during request processing and therefore I don't have any idea about the concurrent modification on Request level. Is this rather an application issue, a myfaces issue, a richfaces issue or a tomcat issue? I can't reproduce this manually of course. Environment: myFaces 1.2.8 richfaces 3.3.3 jsps, no facelets Tomcat 6.0.24 jdk 1.6.0.16 Michael

