Hi,
I am using Struts 2.0.6, Tiles 2.0 and Tomcat 5.5.27. The application runs fine
in the past, but recently we did some load testing and get the following
exception intermittently during load test:
2010-04-08 05:51:09,970 ERROR [http-443-Processor22] ? - End event threw
exception
java.lang.NoSuchMethodException: No such accessible method: addAttribute() on
object: org.apache.tiles.definition.digester.DigesterDefinitionsReader
at
org.apache.commons.beanutils.MethodUtils.invokeMethod(MethodUtils.java:250)
at org.apache.commons.digester.SetNextRule.end(SetNextRule.java:208)
at org.apache.commons.digester.Rule.end(Rule.java:228)
at org.apache.commons.digester.Digester.endElement(Digester.java:1067)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown
Source)
at
org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)
at org.apache.xerces.impl.dtd.XMLDTDValidator.emptyElement(Unknown
Source)
at
org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown
Source)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown
Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.commons.digester.Digester.parse(Digester.java:1591)
at
org.apache.tiles.definition.digester.DigesterDefinitionsReader.read(DigesterDefinitionsReader.java:158)
at
org.apache.tiles.definition.UrlDefinitionsFactory.readDefinitions(UrlDefinitionsFactory.java:257)
at
org.apache.tiles.definition.UrlDefinitionsFactory.getComponentDefinitions(UrlDefinitionsFactory.java:116)
at
org.apache.tiles.definition.UrlDefinitionsFactory.getDefinition(UrlDefinitionsFactory.java:136)
at
org.apache.tiles.impl.BasicTilesContainer.getDefinition(BasicTilesContainer.java:463)
at
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:363)
at
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:345)
at
org.apache.struts2.views.tiles.TilesResult.doExecute(TilesResult.java:107)
at
org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:178)
at
com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:343)
and immediately with the following exceptions:
2010-04-08 05:51:09,970 ERROR [http-443-Processor38] ? -
ApplicationSessionAwareInterceptor:
org.apache.tiles.definition.DefinitionsFactoryException: XML error reading
definitions.
at
org.apache.tiles.definition.digester.DigesterDefinitionsReader.read(DigesterDefinitionsReader.java:161)
at
org.apache.tiles.definition.UrlDefinitionsFactory.readDefinitions(UrlDefinitionsFactory.java:257)
at
org.apache.tiles.definition.UrlDefinitionsFactory.getComponentDefinitions(UrlDefinitionsFactory.java:116)
at
org.apache.tiles.definition.UrlDefinitionsFactory.getDefinition(UrlDefinitionsFactory.java:136)
at
org.apache.tiles.impl.BasicTilesContainer.getDefinition(BasicTilesContainer.java:463)
at
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:363)
at
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:345)
at
org.apache.struts2.views.tiles.TilesResult.doExecute(TilesResult.java:107)
at
org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:178)
at
com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:343)
Both exceptions are from DigesterDefinitionsReader.java and root cause for the
second one is "org.xml.sax.SAXException: FWK005 parse may not be called while
parsing.".
Tiles is using Xerces parser to parse tiles definition, but DocumentBuilder is
not thread safe and it seems Tiles doesn't do synchronization, which caused the
problem. I have changed DigesterDefinitionsReader.java and added a synchronized
block in read(Object source) method and the problems seems have went away.
I am wondering if anyone saw the same issue and is this a Tiles bug? Besides,
why Tiles keep reading the same file?
Boxiong