[ http://issues.apache.org/jira/browse/TAPESTRY-846?page=comments#action_12438230 ] Jeff Lubetkin commented on TAPESTRY-846: ----------------------------------------
I recently tracked down a problem in Zillow's code that has the same symptoms as TAPESTRY-846, and may be caused by a similar problem. We use a custom SpecificationResolverDelegate to keep our templates in WEB-INF. I've documented the approach on the wiki: http://wiki.apache.org/tapestry/SpeclessPagesInWEB-INF. We would get the exception from TAPESTRY-846 when our performance testers would hit a new, previously unloaded page with substantial load. Simply requesting the page once before starting the test would prevent the issue. I tracked the problem down to the custom resolver's setupImplicitPage method. If two threads tried to load for the first time a new page simultaneously, two implicit ComponentSpecifications would be created. Having two spec objects for the same page caused the "synchronized( specification )" to fail in ComponentConstructorFactoryImpl.getComponentConstructor, causing the same component to be enhanced twice, resulting in the exception. I fixed this in our code by synchronizing AppSpecRelativeSpecificationResolverDelegate.setupImplicitPage and storing the created implicit ComponentSpecifications in a map keyed on the simpleName parameter. The method checks the map first, guaranteeing that each page will only ever have one implicit spec object created. We can no longer reproduce the exception. I've looked at the code for PageSpecificationResolverImpl.setupImplicitPage, and I think it's subject to the same problem. If two requests for the same implicitly-specced page get past the call to namespace.containsPage in the resolve method, two implict spec objects will be created and the getComponentConstructor syncronization will fail. This may be what people are seeing, but since we don't use that code I don't know for sure. > Random error accesing pages: Property " " has already been accounted for by > the element at Annotation ... > --------------------------------------------------------------------------------------------------------- > > Key: TAPESTRY-846 > URL: http://issues.apache.org/jira/browse/TAPESTRY-846 > Project: Tapestry > Issue Type: Bug > Components: Annotations > Affects Versions: 4.0 > Environment: Linux, OS X, WXP > Reporter: Raul Raja Martinez > Assigned To: Jesse Kuhnert > > As posted in Tapestry mailing list: > I have been unable to write a test to reproduce the error since it happens > randomly which makes me thing that it happens when classes are enhanced. I > have checked all my classes and > com.estudiowebs.CMS.components.AbstractCMSComponent is the only place where > that property is declared. > Here is my code: > public abstract class AbstractCMSComponent extends BaseComponent { > > @InjectPage("News") > public abstract News getNewsPage(); > } > public abstract class AbstractCategoryLinker extends AbstractCMSComponent { > public IPage onClickMenuItem() { > Contact cp = getContactPage(); > return cp; > } > public abstract class MenuNavigation extends AbstractCategoryLinker { > } > Here is the stack trace: > org.apache.hivemind.ApplicationRuntimeException > Property newsPage has already been accounted for by the element at Annotation > @org.apache.tapestry.annotations.InjectPage(value=News) of public abstract > com.estudiowebs.CMS.pages.News > com.estudiowebs.CMS.components.AbstractCMSComponent.getNewsPage(). > location: Annotation > @org.apache.tapestry.annotations.InjectPage(value=News) of public abstract > com.estudiowebs.CMS.pages.News > com.estudiowebs.CMS.components.AbstractCMSComponent.getNewsPage() > Stack Trace: > * > org.apache.tapestry.spec.ComponentSpecification.claimProperty(ComponentSpecification.java:674) > * > org.apache.tapestry.spec.ComponentSpecification.addInjectSpecification(ComponentSpecification.java:645) > * > org.apache.tapestry.annotations.InjectPageAnnotationWorker.performEnhancement(InjectPageAnnotationWorker.java:50) > * > org.apache.tapestry.annotations.AnnotationEnhancementWorker.performMethodEnhancement(AnnotationEnhancementWorker.java:142) > * > org.apache.tapestry.annotations.AnnotationEnhancementWorker.performMethodEnhancement(AnnotationEnhancementWorker.java:110) > * > org.apache.tapestry.annotations.AnnotationEnhancementWorker.performEnhancement(AnnotationEnhancementWorker.java:70) > * > $EnhancementWorker_108fb922aed.performEnhancement($EnhancementWorker_108fb922aed.java) > * > $EnhancementWorker_108fb922aef.performEnhancement($EnhancementWorker_108fb922aef.java) > * > $EnhancementWorker_108fb922acb.performEnhancement($EnhancementWorker_108fb922acb.java) > * > org.apache.tapestry.services.impl.ComponentConstructorFactoryImpl.getComponentConstructor(ComponentConstructorFactoryImpl.java:97) > * > $ComponentConstructorFactory_108fb922ab8.getComponentConstructor($ComponentConstructorFactory_108fb922ab8.java) > * > org.apache.tapestry.pageload.PageLoader.instantiateComponent(PageLoader.java:531) > * > org.apache.tapestry.pageload.PageLoader.constructComponent(PageLoader.java:401) > * > org.apache.tapestry.pageload.PageLoader.createImplicitComponent(PageLoader.java:494) > * > $IPageLoader_108fb922aa8.createImplicitComponent($IPageLoader_108fb922aa8.java) > * > $IPageLoader_108fb922aa9.createImplicitComponent($IPageLoader_108fb922aa9.java) > * > org.apache.tapestry.services.impl.ComponentTemplateLoaderLogic.createImplicitComponent(ComponentTemplateLoaderLogic.java:218) > * > org.apache.tapestry.services.impl.ComponentTemplateLoaderLogic.process(ComponentTemplateLoaderLogic.java:172) > * > org.apache.tapestry.services.impl.ComponentTemplateLoaderLogic.process(ComponentTemplateLoaderLogic.java:111) > * > org.apache.tapestry.services.impl.ComponentTemplateLoaderLogic.loadTemplate(ComponentTemplateLoaderLogic.java:88) > * > org.apache.tapestry.services.impl.ComponentTemplateLoaderImpl.loadTemplate(ComponentTemplateLoaderImpl.java:60) > * > $ComponentTemplateLoader_108fb922abc.loadTemplate($ComponentTemplateLoader_108fb922abc.java) > * > org.apache.tapestry.pageload.PageLoader.loadTemplateForComponent(PageLoader.java:648) > * org.apache.tapestry.BaseComponent.readTemplate(BaseComponent.java:77) > * org.apache.tapestry.BaseComponent.finishLoad(BaseComponent.java:107) > * $Contact_470.finishLoad($Contact_470.java) > * > org.apache.tapestry.pageload.PageLoader.constructComponent(PageLoader.java:439) > * org.apache.tapestry.pageload.PageLoader.loadPage(PageLoader.java:613) > * $IPageLoader_108fb922aa8.loadPage($IPageLoader_108fb922aa8.java) > * $IPageLoader_108fb922aa9.loadPage($IPageLoader_108fb922aa9.java) > * org.apache.tapestry.pageload.PageSource.getPage(PageSource.java:120) > * $IPageSource_108fb922a07.getPage($IPageSource_108fb922a07.java) > * org.apache.tapestry.engine.RequestCycle.loadPage(RequestCycle.java:268) > * org.apache.tapestry.engine.RequestCycle.getPage(RequestCycle.java:251) > * $MenuNavigation_464.getContactPage($MenuNavigation_464.java) > * > com.estudiowebs.CMS.components.AbstractCategoryLinker.onClickMenuItem(AbstractCategoryLinker.java:20) > * sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > * > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > * > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > * java.lang.reflect.Method.invoke(Method.java:585) > * > org.apache.tapestry.listener.ListenerMethodInvokerImpl.invokeTargetMethod(ListenerMethodInvokerImpl.java:214) > * > org.apache.tapestry.listener.ListenerMethodInvokerImpl.invokeListenerMethod(ListenerMethodInvokerImpl.java:155) > * > org.apache.tapestry.listener.ListenerMethodInvokerImpl.searchAndInvoke(ListenerMethodInvokerImpl.java:124) > * > org.apache.tapestry.listener.ListenerMethodInvokerImpl.invokeListenerMethod(ListenerMethodInvokerImpl.java:65) > * > org.apache.tapestry.listener.SyntheticListener.actionTriggered(SyntheticListener.java:51) > * > org.apache.tapestry.binding.ListenerMethodBinding.actionTriggered(ListenerMethodBinding.java:77) > * > org.apache.tapestry.listener.ListenerInvokerTerminator.invokeListener(ListenerInvokerTerminator.java:51) > * > $ListenerInvoker_108fb922a35.invokeListener($ListenerInvoker_108fb922a35.java) > * org.apache.tapestry.link.DirectLink.trigger(DirectLink.java:105) > * > org.apache.tapestry.engine.DirectService.triggerComponent(DirectService.java:146) > * org.apache.tapestry.engine.DirectService.service(DirectService.java:132) > * $IEngineService_108fb922a92.service($IEngineService_108fb922a92.java) > * > org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java:66) > * > org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:248) > * > org.apache.tapestry.services.impl.InvokeEngineTerminator.service(InvokeEngineTerminator.java:60) > * > $WebRequestServicer_108fb922a6b.service($WebRequestServicer_108fb922a6b.java) > * > org.apache.tapestry.services.impl.DisableCachingFilter.service(DisableCachingFilter.java:48) > * > $WebRequestServicerFilter_108fb922a6d.service($WebRequestServicerFilter_108fb922a6d.java) > * > $WebRequestServicer_108fb922a6f.service($WebRequestServicer_108fb922a6f.java) > * > $WebRequestServicer_108fb922a67.service($WebRequestServicer_108fb922a67.java) > * > org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipelineBridge.java:56) > * > $ServletRequestServicer_108fb922a4b.service($ServletRequestServicer_108fb922a4b.java) > * > org.apache.tapestry.request.DecodedRequestInjector.service(DecodedRequestInjector.java:55) > * > $ServletRequestServicerFilter_108fb922a47.service($ServletRequestServicerFilter_108fb922a47.java) > * > $ServletRequestServicer_108fb922a4d.service($ServletRequestServicer_108fb922a4d.java) > * > org.apache.tapestry.multipart.MultipartDecoderFilter.service(MultipartDecoderFilter.java:52) > * > $ServletRequestServicerFilter_108fb922a45.service($ServletRequestServicerFilter_108fb922a45.java) > * > $ServletRequestServicer_108fb922a4d.service($ServletRequestServicer_108fb922a4d.java) > * > org.apache.tapestry.services.impl.SetupRequestEncoding.service(SetupRequestEncoding.java:53) > * > $ServletRequestServicerFilter_108fb922a49.service($ServletRequestServicerFilter_108fb922a49.java) > * > $ServletRequestServicer_108fb922a4d.service($ServletRequestServicer_108fb922a4d.java) > * > $ServletRequestServicer_108fb922a3f.service($ServletRequestServicer_108fb922a3f.java) > * > org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:123) > * org.apache.tapestry.ApplicationServlet.doGet(ApplicationServlet.java:79) > * javax.servlet.http.HttpServlet.service(HttpServlet.java:689) > * javax.servlet.http.HttpServlet.service(HttpServlet.java:802) > * > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) > * > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) > * > org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:172) > * > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) > * > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) > * > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) > * > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) > * > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) > * > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) > * > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) > * > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) > * > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) > * > org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:868) > * > org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:663) > * > org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) > * > org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) > * > org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) > * java.lang.Thread.run(Thread.java:613) -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
