On Wed, May 26, 2010 at 14:08, Alex Kotchnev <akoch...@gmail.com> wrote:
> Dmitry, > very nice analysis. Before explicitly setting the application version, > did you observe the issues w/ the assets loading intermittently ? > > Yes I had problems with this. Instead of returning CSS/JS contents T5 rendered index page and returned it as result. > Regards, > > Alex K > > On Wed, May 26, 2010 at 5:55 AM, Dmitry Gusev <dmitry.gu...@gmail.com > >wrote: > > > I think have some progress in this. > > > > After upgrade to latest T5.2.0-SNAPSHOT resource links like > > > > <link rel="stylesheet" type="text/css" > > > href="/assets/anjlab/cubics/css/cube.css" /> > > > > > > > not working anymore. So I desided to switch to Assets. > > > > Now the same CSS referenced like this: > > > > <link rel="stylesheet" type="text/css" > > href="${asset:classpath:/anjlab/cubics/css/cube.css}" /> > > > > Note its located in another jar. To make this work I had to contribute to > > ClasspathAssetAliasManager: > > > > public static void > > contributeClasspathAssetAliasManager(MappedConfiguration<String, String> > > configuration) > > { > > configuration.add("cubics", "anjlab/cubics"); > > } > > > > Other stylesheets located at my app referenced like this: > > > > <link rel="stylesheet" type="text/css" href="${context:/css/all.css}" > /> > > > > During rendering this link became: > > > > http://ping-service.appspot.com/assets/1e85d3b227a83f96/ctx/css/all.css > > > > Note this '1e85d3b227a83f96' hash. As I learned this is > > APPLICATION_VERSION, > > which is by default: > > > > configuration.add(SymbolConstants.APPLICATION_VERSION, > > Long.toHexString(random.nextLong())); > > > > So two different instances of applications will have different > application > > versions unless you contribute APPLICATION_VERSION in your AppModule > (this > > is what I had to do to avoid asset errors). > > > > Now imagine that GAE hosts two instances of your app to handle requests. > > One > > request retrieves HTML with links to CSS and JS files. Your browser will > > try > > load these assets simultaneously and it may happen that second instance > > will > > handle one of those requests, and since it have another value of > > APPLICATION_VERSION you will get an error and browser couldn't load > > response. > > > > To fix it you should declare APPLICATION_VERSION explicitly in AppModule, > > here is mine: > > > > public static void contributeApplicationDefaults( > > MappedConfiguration<String, String> configuration) > > { > > // ... > > configuration.add(SymbolConstants.APPLICATION_VERSION, "beta"); > > } > > > > > > Hope this help. > > > > > > > > On Tue, Apr 13, 2010 at 21:13, Dmitry Gusev <dmitry.gu...@gmail.com> > > wrote: > > > > > Alex, > > > > > > I don't have anything special in the app config, here is it: > > > > > > <?xml version="1.0" encoding="utf-8"?> > > > <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> > > > <application>ping-service</application> > > > <version>beta</version> > > > <sessions-enabled>true</sessions-enabled> > > > <precompilation-enabled>true</precompilation-enabled> > > > > > > <!-- Configure java.util.logging --> > > > <system-properties> > > > <property name="java.util.logging.config.file" > > > value="WEB-INF/logging.properties"/> > > > </system-properties> > > > > > > <admin-console> > > > <page name="Appstats" url="/appstats/" /> > > > </admin-console> > > > </appengine-web-app> > > > > > > I'd also recommend you to set up appstats, you may find something > > > interesting in there. > > > > > > As for request deadlines, I'm also having HardDeadlineExceededError, > and > > > this usually happens in two reasons: > > > 1. New T5 instance starting up. According to logs it tooks about 20 > > seconds > > > in average to startup (thats why your may to be unresponsive within in > 10 > > > seconds for ping service). > > > > > > Such requests in logs starts like this: > > > > > > > > > 1. > > > > > > 0.1.0.2 - - [13/Apr/2010:06:38:31 -0700] "GET > > > /task/runjob;jsessionid=KpgsZ4bjrewWXHbiG4OlWg/?job=agxwaW5nLXNlcnZpY2VyGAsSCFNjaGVkdWxlGDwMCxIDSm9iGNEPDA > > HTTP/1.1" 500 8799 " > > http://ping-service.appspot.com/cron/?schedule=every%205%20minutes" > > "AppEngine-Google; (+http://code.google.com/appengine)" " > > ping-service.appspot.com" > > > > > > 2. D 04-13 06:38AM 10.523 > > > > > > org.apache.tapestry5.ioc.internal.ModuleImpl create: Creating > service > > 'TimingFilter'. > > > > > > 3. D 04-13 06:38AM 10.543 > > > > > > org.apache.tapestry5.ioc.internal.ModuleImpl create: Creating > service > > 'Utf8Filter'. > > > > > > > > > ... > > > > > > 04-13 06:38AM 29.877 > > > > > > dmitrygusev.ping.services.JobExecutor execute: Error fetching url > > http://www.zadachite.com > > > com.google.apphosting.api.DeadlineExceededException: This request > > (94c02a0647915c1e) started at 2010/04/13 13:38:01.337 UTC and was still > > executing at 2010/04/13 13:38:29.868 UTC. > > > > > > > > > at java.lang.Object.wait(Native Method) > > > at java.lang.Object.wait(Object.java:443) > > > at java.util.concurrent.TimeUnit.timedWait(Unknown Source) > > > at > > com.google.apphosting.runtime.AsyncFuture.get(AsyncFuture.java:60) > > > > > > > > > at > > > com.google.apphosting.runtime.ApiProxyImpl$AsyncApiFuture.get(ApiProxyImpl.java:319) > > > at > > > com.google.apphosting.runtime.ApiProxyImpl$AsyncApiFuture.get(ApiProxyImpl.java:210) > > > at > > > com.google.apphosting.runtime.ApiProxyImpl.doSyncCall(ApiProxyImpl.java:131) > > > > > > > > > at > > > com.google.apphosting.runtime.ApiProxyImpl.access$000(ApiProxyImpl.java:43) > > > at > > com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:104) > > > at > > com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:102) > > > > > > > > > at java.security.AccessController.doPrivileged(Native Method) > > > at > > > com.google.apphosting.runtime.ApiProxyImpl.makeSyncCall(ApiProxyImpl.java:102) > > > at > > > com.google.apphosting.runtime.ApiProxyImpl.makeSyncCall(ApiProxyImpl.java:43) > > > > > > > > > at > > > com.google.appengine.tools.appstats.Recorder.makeSyncCall(Recorder.java:225) > > > at > > com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:102) > > > at > > > com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:34) > > > > > > was this yours? :) > > > > > > If you're using Spring, new T5 instance startup may take longer than 30 > > > secs which will lead to deadline exception. I used Spring for > transaction > > > management before, but I refused to use it and using Tynamo now. > > > > > > I also noticed that exceptions make take pretty much time of request, > so > > if > > > you have any exceptions (no matter handled or not) requests become > > longer. I > > > found that if you're using Tynamo, you usually get one > RollbackException > > at > > > the end of each request. > > > > > > 2. The other reason of deadline exceptions for me are long database > > > requests. I found that in some cases datastore queries (even simple > > queries) > > > may take too many time to process sometime, but in other cases the same > > > queries run pretty fast. > > > > > > p.s. > > > favicon.ico is not an issue actually, all you need to fix it is put > > > favicon.ico icon to your app. > > > I already have favicon, but its with *.png extension. Looks like some > > > browsers still looking for *.ico... > > > I should convert that *.png to *.ico ... can't settle down to this :) > > > > > > > > > > > > On Tue, Apr 13, 2010 at 18:36, Alex Kotchnev <akoch...@gmail.com> > wrote: > > > > > >> Dmitry, > > >> I do have the favicon.ico issue showing up in the logs as well, I'll > > >> need > > >> to look into that. Do you have anything special set up for the "static > > >> files" section in the appengine config xml file ? > > >> > > >> The problem w/ the failed requests for assets is that they don't > show > > up > > >> in the error log. Every once in a while, I'd get an error like this > > (which > > >> shouldn't happen - a request to a simple page should never take 30 > > >> seconds) > > >> : > > >> > > >> Regards, > > >> > > >> Alex K > > >> > > >> Error for /faq > > >> com.google.apphosting.runtime.HardDeadlineExceededError: This request > > >> (b2c1ec272f017727) started at 2010/04/10 10:56:07.705 UTC and was > > >> still executing at 2010/04/10 10:56:36.820 UTC. > > >> > > >> at > > >> > > > org.apache.tapestry5.ioc.util.CaseInsensitiveMap.access$008(CaseInsensitiveMap.java:30) > > >> at > > >> > > > org.apache.tapestry5.ioc.util.CaseInsensitiveMap$Position.put(CaseInsensitiveMap.java:287) > > >> at > > >> > > > org.apache.tapestry5.ioc.util.CaseInsensitiveMap.put(CaseInsensitiveMap.java:355) > > >> > > >> at > > >> > > > org.apache.tapestry5.ioc.util.CaseInsensitiveMap.put(CaseInsensitiveMap.java:30) > > >> at > > >> > > > org.apache.tapestry5.ioc.internal.services.ClassPropertyAdapterImpl.<init>(ClassPropertyAdapterImpl.java:53) > > >> at > > >> > > > org.apache.tapestry5.ioc.internal.services.PropertyAccessImpl.buildAdapter(PropertyAccessImpl.java:92) > > >> > > >> at > > >> > > > org.apache.tapestry5.ioc.internal.services.PropertyAccessImpl.getAdapter(PropertyAccessImpl.java:65) > > >> at > > >> > $PropertyAccess_127e75ce676.getAdapter($PropertyAccess_127e75ce676.java) > > >> at > > >> > > > org.apache.tapestry5.internal.services.PropertyConduitSourceImpl$PropertyConduitBuilder.infoForPropertyNode(PropertyConduitSourceImpl.java:978) > > >> > > >> at > > >> > > > org.apache.tapestry5.internal.services.PropertyConduitSourceImpl$PropertyConduitBuilder.infoForPropertyOrMethod(PropertyConduitSourceImpl.java:971) > > >> at > > >> > > > org.apache.tapestry5.internal.services.PropertyConduitSourceImpl$PropertyConduitBuilder.createGetterAndSetter(PropertyConduitSourceImpl.java:433) > > >> > > >> at > > >> > > > org.apache.tapestry5.internal.services.PropertyConduitSourceImpl$PropertyConduitBuilder.createAccessors(PropertyConduitSourceImpl.java:416) > > >> at > > >> > > > org.apache.tapestry5.internal.services.PropertyConduitSourceImpl$PropertyConduitBuilder.createInstance(PropertyConduitSourceImpl.java:270) > > >> > > >> at > > >> > > > org.apache.tapestry5.internal.services.PropertyConduitSourceImpl.build(PropertyConduitSourceImpl.java:1254) > > >> at > > >> > > > org.apache.tapestry5.internal.services.PropertyConduitSourceImpl.create(PropertyConduitSourceImpl.java:1121) > > >> > > >> at > > >> > > > $PropertyConduitSource_127e75ce6ee.create($PropertyConduitSource_127e75ce6ee.java) > > >> at > > >> > > > org.apache.tapestry5.internal.bindings.PropBindingFactory.newBinding(PropBindingFactory.java:49) > > >> at > > >> > $BindingFactory_127e75ce6ef.newBinding($BindingFactory_127e75ce6ef.java) > > >> > > >> at > > >> > $BindingFactory_127e75ce6e7.newBinding($BindingFactory_127e75ce6e7.java) > > >> at > > >> > > > org.apache.tapestry5.internal.services.BindingSourceImpl.newBinding(BindingSourceImpl.java:81) > > >> at > > >> $BindingSource_127e75ce6c5.newBinding($BindingSource_127e75ce6c5.java) > > >> > > >> at > > >> > > > org.apache.tapestry5.internal.services.PageElementFactoryImpl.newExpansionElement(PageElementFactoryImpl.java:165) > > >> at > > >> > > > $PageElementFactory_127e75ce6df.newExpansionElement($PageElementFactory_127e75ce6df.java) > > >> at > > >> > > > org.apache.tapestry5.internal.pageload.PageLoaderImpl$15.execute(PageLoaderImpl.java:1024) > > >> > > >> at > > >> > > > org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.runActions(ComponentAssemblerImpl.java:207) > > >> at > > >> > > > org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.assembleEmbeddedComponent(ComponentAssemblerImpl.java:157) > > >> > > >> at > > >> > > > org.apache.tapestry5.internal.pageload.PageLoaderImpl$12.execute(PageLoaderImpl.java:947) > > >> at > > >> > > > org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.runActions(ComponentAssemblerImpl.java:207) > > >> at > > >> > > > org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.assembleRootComponent(ComponentAssemblerImpl.java:88) > > >> > > >> at > > >> > > > org.apache.tapestry5.internal.pageload.PageLoaderImpl.loadPage(PageLoaderImpl.java:159) > > >> at > $PageLoader_127e75ce6d1.loadPage($PageLoader_127e75ce6d1.java) > > >> at > > >> > > > org.apache.tapestry5.internal.services.PagePoolCache.checkout(PagePoolCache.java:210) > > >> > > >> at > > >> > > > org.apache.tapestry5.internal.services.PagePoolImpl.checkout(PagePoolImpl.java:99) > > >> at $PagePool_127e75ce6d0.checkout($PagePool_127e75ce6d0.java) > > >> at > > >> > > > org.apache.tapestry5.internal.services.RequestPageCacheImpl.get(RequestPageCacheImpl.java:51) > > >> > > >> at > > >> $RequestPageCache_127e75ce6cf.get($RequestPageCache_127e75ce6cf.java) > > >> at > > >> $RequestPageCache_127e75ce6b8.get($RequestPageCache_127e75ce6b8.java) > > >> at > > >> > > > org.apache.tapestry5.internal.services.PageRenderRequestHandlerImpl.handle(PageRenderRequestHandlerImpl.java:52) > > >> > > >> at > > >> > > > org.apache.tapestry5.services.TapestryModule$33.handle(TapestryModule.java:2262) > > >> at > > >> > > > $PageRenderRequestHandler_127e75ce6bb.handle($PageRenderRequestHandler_127e75ce6bb.java) > > >> at > > >> > > > $PageRenderRequestHandler_127e75ce6a3.handle($PageRenderRequestHandler_127e75ce6a3.java) > > >> > > >> at > > >> > > > org.apache.tapestry5.internal.services.ComponentRequestHandlerTerminator.handlePageRender(ComponentRequestHandlerTerminator.java:48) > > >> at > > >> > > > $ComponentRequestHandler_127e75ce6a8.handlePageRender($ComponentRequestHandler_127e75ce6a8.java) > > >> > > >> at > > >> > > > org.apache.tapestry5.internal.services.PageRenderDispatcher.dispatch(PageRenderDispatcher.java:45) > > >> at > $Dispatcher_127e75ce6aa.dispatch($Dispatcher_127e75ce6aa.java) > > >> at > $Dispatcher_127e75ce6a0.dispatch($Dispatcher_127e75ce6a0.java) > > >> > > >> at > > >> > > > org.apache.tapestry5.services.TapestryModule$RequestHandlerTerminator.service(TapestryModule.java:255) > > >> at > > >> > > > nu.localhost.tapestry5.springsecurity.services.internal.RequestFilterWrapper$1.doFilter(RequestFilterWrapper.java:60) > > >> > > >> at > > >> > > > nu.localhost.tapestry5.springsecurity.services.internal.SpringSecurityExceptionTranslationFilter.doFilterHttp(SpringSecurityExceptionTranslationFilter.java:100) > > >> at > > >> > > > org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) > > >> > > >> at > > >> > > > nu.localhost.tapestry5.springsecurity.services.internal.RequestFilterWrapper.service(RequestFilterWrapper.java:55) > > >> at > > >> $RequestHandler_127e75ce6a1.service($RequestHandler_127e75ce6a1.java) > > >> at > > >> > > > org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26) > > >> > > >> at > > >> $RequestHandler_127e75ce6a1.service($RequestHandler_127e75ce6a1.java) > > >> at > > >> > > > org.apache.tapestry5.services.TapestryModule$4.service(TapestryModule.java:937) > > >> at > > >> $RequestHandler_127e75ce6a1.service($RequestHandler_127e75ce6a1.java) > > >> > > >> at > > >> > > > org.apache.tapestry5.services.TapestryModule$3.service(TapestryModule.java:926) > > >> at > > >> $RequestHandler_127e75ce6a1.service($RequestHandler_127e75ce6a1.java) > > >> at > > >> > > > org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:85) > > >> > > >> at > > >> $RequestHandler_127e75ce6a1.service($RequestHandler_127e75ce6a1.java) > > >> at > > >> > > > org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:90) > > >> at > > >> > > > org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:81) > > >> > > >> at > > >> > > > org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:85) > > >> at > > >> > > > org.apache.tapestry5.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:103) > > >> at > > >> $RequestHandler_127e75ce6a1.service($RequestHandler_127e75ce6a1.java) > > >> > > >> at > > >> $RequestHandler_127e75ce695.service($RequestHandler_127e75ce695.java) > > >> at > > >> > > > org.apache.tapestry5.services.TapestryModule$HttpServletRequestHandlerTerminator.service(TapestryModule.java:206) > > >> at > > >> > > > nu.localhost.tapestry5.springsecurity.services.internal.HttpServletRequestFilterWrapper$1.doFilter(HttpServletRequestFilterWrapper.java:56) > > >> > > >> at > > >> > > > org.springframework.security.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) > > >> at > > >> > > > org.springframework.security.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) > > >> > > >> at > > >> > > > nu.localhost.tapestry5.springsecurity.services.internal.HttpServletRequestFilterWrapper.service(HttpServletRequestFilterWrapper.java:52) > > >> at > > >> > > > $HttpServletRequestFilter_127e75ce693.service($HttpServletRequestFilter_127e75ce693.java) > > >> > > >> at > > >> > > > $HttpServletRequestHandler_127e75ce697.service($HttpServletRequestHandler_127e75ce697.java) > > >> at > > >> > > > nu.localhost.tapestry5.springsecurity.services.internal.HttpServletRequestFilterWrapper$1.doFilter(HttpServletRequestFilterWrapper.java:56) > > >> > > >> at > > >> > > > nu.localhost.tapestry5.springsecurity.services.internal.SpringSecurityExceptionTranslationFilter.doFilterHttp(SpringSecurityExceptionTranslationFilter.java:100) > > >> at > > >> > > > org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53) > > >> > > >> at > > >> > > > nu.localhost.tapestry5.springsecurity.services.internal.HttpServletRequestFilterWrapper.service(HttpServletRequestFilterWrapper.java:52) > > >> at > > >> > > > $HttpServletRequestHandler_127e75ce697.service($HttpServletRequestHandler_127e75ce697.java) > > >> > > >> at nu.loca > > >> > > >> > > >> > > >> On Tue, Apr 13, 2010 at 9:31 AM, Dmitry Gusev <dmitry.gu...@gmail.com > > >> >wrote: > > >> > > >> > Hi, Alex > > >> > > > >> > I'm including *.css and *.png by simply using link rel, like this: > > >> > > > >> > <link rel="stylesheet" type="text/css" > > >> > href="/assets/anjlab/cubics/css/cube.css" /> > > >> > > > >> > cube.css located here: > > >> > > > >> > > > >> > > > >> > > > ping-service\war\WEB-INF\lib\cubics-renders-1.0.1.jar\anjlab\cubics\css\cube.css > > >> > > > >> > I also set up regexAuthorizer: > > >> > > > >> > public void contributeRegexAuthorizer(Configuration<String> > regex) > > >> > { > > >> > String pathPattern = > > >> > "([^/.]+/)*[^/.]+\\.((css)|(js)|(jpg)|(jpeg)|(png)|(gif))$"; > > >> > regex.add("^anjlab/cubics/css/" + pathPattern); > > >> > regex.add("^anjlab/cubics/images/" + pathPattern); > > >> > regex.add("^anjlab/cubics/js/" + pathPattern); > > >> > regex.add("^anjlab/cubics/js/jquery-1.3.2.js"); > > >> > } > > >> > > > >> > I can't say I have any problems with this. > > >> > At least right now in my error list at GAE Admin console I don't > have > > >> any > > >> > assets related issues. > > >> > > > >> > I have only one page actively using *.css, *.js, etc., here's the > > >> > declarations: > > >> > > > >> > <head> > > >> > <title>Job Analytics - Ping Service</title> > > >> > <link rel="stylesheet" type="text/css" href="/css/all.css" /> > > >> > <link rel="icon" type="image/png" href="/favicon.png" /> > > >> > <link rel="stylesheet" type="text/css" > > >> > href="/assets/anjlab/cubics/css/cube.css" /> > > >> > <link rel="stylesheet" type="text/css" href="/css/analytics.css" > /> > > >> > <script type="text/javascript" > > >> > src="/assets/anjlab/cubics/js/jquery-1.3.2.js"></script> > > >> > <script type="text/javascript" > > >> > src="/assets/anjlab/cubics/js/cube.js"></script> > > >> > <!--[if IE]><script language="javascript" type="text/javascript" > > >> > src="excanvas.min.js"></script><![endif]--> > > >> > <script type="text/javascript" src="/js/jquery.flot.js"></script> > > >> > <script type="text/javascript" > > src="/js/jquery.flot.pie.js"></script> > > >> > <script type="text/javascript" src="/js/analytics.js"></script> > > >> > </head> > > >> > > > >> > p.s. > > >> > One issue I have though is '/favicon.ico' problem :) > > >> > > > >> > On Tue, Apr 13, 2010 at 17:20, Alex Kotchnev <akoch...@gmail.com> > > >> wrote: > > >> > > > >> > > Daniel, > > >> > > I do try to watch out for T5/GAE related posts on this list and > > try > > >> to > > >> > > respond to the best of my ability. I would blog about this more if > I > > >> > > weren't > > >> > > as swamped with things to do. > > >> > > > > >> > > I would be interested in hearing from other folks (e.g. Dmitry) > > that > > >> > have > > >> > > deployed on GAE - in previous questions relating to this issue, > > folks > > >> had > > >> > > mentioned that they don't have a problem w/ this, which makes me > > think > > >> > that > > >> > > I might have something configured incorrectly (although I'm not > > doing > > >> > > special here, other than having a few images loaded from the > > >> > stylesheet). > > >> > > I > > >> > > do use the AssetAuthorizer (that was eventually added to 5.2) and > > >> that's > > >> > > another possible failure point (e.g. if for whatever reason, the > > >> > > authorization fails in some cases and denies access). > > >> > > > > >> > > On the other hand, serving these assets as static content has > > >> dropped > > >> > my > > >> > > CPU usage - I had an cron job watching the site and keeping it > warm > > >> (so > > >> > > that > > >> > > GAE doesn't swap it out), which was using up about 40% of the free > > CPU > > >> > > quota > > >> > > - so far, the CPU usage should be about 20% lower. > > >> > > > > >> > > Regards, > > >> > > > > >> > > Alex Kotchnev > > >> > > > > >> > > On Tue, Apr 13, 2010 at 3:44 AM, Daniel Henze < > > dhe...@googlemail.com> > > >> > > wrote: > > >> > > > > >> > > > Hi Alex, > > >> > > > > > >> > > > thanks for that follow-up post. Since I'm going to develop with > T5 > > >> on > > >> > GAE > > >> > > > as well, this will be in the back of my head as a potential > > cave-at. > > >> > I'll > > >> > > be > > >> > > > interested in any further findings regarding GAE since it seems > > that > > >> > > > Tapestry is better tailored towards this particular platform > > >> (compared > > >> > to > > >> > > > Wicket). > > >> > > > > > >> > > > Best regards > > >> > > > Daniel > > >> > > > > > >> > > > Am 13.04.2010 06:23, schrieb Alex Kotchnev: > > >> > > > > > >> > > > I spent some more time looking at this and I ended up removing > > the > > >> > usage > > >> > > >> of > > >> > > >> the ${asset:context:css/foobar.css} from the main templates. > > After > > >> > doing > > >> > > >> so, > > >> > > >> all of the issues related to the stylesheet (and the > > >> sub-stylesheets > > >> > and > > >> > > >> images that it loads) were cleared up - now, the stylesheets > load > > >> > > properly > > >> > > >> every time when they're not loaded through the asset service. > > >> > > >> > > >> > > >> I first thought that this might be an issue w/ how GAE handles > > >> static > > >> > > >> files > > >> > > >> - supposedly, all files in the web context are handled > specially > > ( > > >> w/ > > >> > > the > > >> > > >> exception of JSPs of course, but that's not relevant in T5), > > >> probably > > >> > > >> served > > >> > > >> up from outside of Jetty (which is what runs the app in GAE) > and > > >> there > > >> > > >> might > > >> > > >> be something that is weird in GAE giving access to those static > > >> > assets. > > >> > > >> However, after I switched to just using the raw path to the css > > >> (w/o > > >> > > using > > >> > > >> the asset:context binding prefixes), I continued having the > same > > >> > > >> intermittent access issues for assets that are served from a > > >> > component. > > >> > > >> Which on its own indicates that the issue is somewhere between > > the > > >> > Asset > > >> > > >> service (which I haven't looked at the source code for yet) and > > the > > >> > way > > >> > > it > > >> > > >> uses the servlet API and/or the filesystem to serve the assets > > that > > >> > it's > > >> > > >> asked for. > > >> > > >> > > >> > > >> I haven't moved all my css / image serving out of the asset > > service > > >> - > > >> > it > > >> > > >> has > > >> > > >> some cool ideas in terms of being able to package the app. > > However, > > >> > > >> considering that I'm dealing w/ a fairly simple app, and > despite > > >> that > > >> > I > > >> > > >> like > > >> > > >> the ideas behind the asset service, I'll probably move off of > it > > - > > >> I > > >> > do > > >> > > >> recall seeing some mentions of an alternative binding prefix to > > >> serve > > >> > > the > > >> > > >> assets in question from a CDN ; however, considering that the > > >> google > > >> > > >> static > > >> > > >> file serving infrastructure is probably as good as serving from > a > > >> CDN, > > >> > > >> I'll > > >> > > >> probably just stick to static files. > > >> > > >> > > >> > > >> Anyway, I thought this might be useful to someone else that > might > > >> run > > >> > > into > > >> > > >> issues with the Asset service and GAE. It would be interesting > to > > >> look > > >> > > at > > >> > > >> the asset service implementation and see if there is an issue > to > > be > > >> > > filed > > >> > > >> w/ > > >> > > >> GAE re: accessing resources (classpath and web context). > > >> > > >> > > >> > > >> Regards, > > >> > > >> > > >> > > >> Alex K > > >> > > >> > > >> > > >> On Mon, Apr 12, 2010 at 1:27 PM, akochnev_chub< > > >> > akoch...@commercehub.com > > >> > > >> >wrote: > > >> > > >> > > >> > > >> > > >> > > >> > > >> > > >>> I've been running into some issues w/ the asset service, in > that > > >> at > > >> > > times > > >> > > >>> it > > >> > > >>> responds to service requests with 404s. After "warming up" the > > app > > >> by > > >> > > >>> reloading the pages in question a few times, the asset service > > >> > > eventually > > >> > > >>> responds w/ the assets. However, this results in a very > > unreliable > > >> > > >>> rendering > > >> > > >>> of the pages - at times (if the app happens to be "warm"), > the > > >> pages > > >> > > >>> render > > >> > > >>> just fine; at other times, I have to reload them a few times > > >> before > > >> > > >>> getting > > >> > > >>> to proper rendering. Below are some more details on the > issue, > > >> any > > >> > > >>> suggestions on how to deal w/ it would be highly appreciated. > > >> > > >>> > > >> > > >>> > > >> > > >>> There is a pretty good chance that this might be an issue w/ > the > > >> > > >>> underlying > > >> > > >>> platform (GAE), and the way it chooses to swap the application > > in > > >> and > > >> > > >>> out; > > >> > > >>> however, if that were the case, I would have expected more of > > the > > >> > > >>> requests > > >> > > >>> to fail instead of the page content rendering fine and then > the > > >> > assets > > >> > > >>> not > > >> > > >>> returning in time. > > >> > > >>> > > >> > > >>> I think the issue is partially aggravated by the fact that I > > load > > >> the > > >> > > >>> main > > >> > > >>> stylesheet as a context asset (asset:context:/css/foo.css or > > >> > something > > >> > > >>> similar), instead of just using the "naked" (e.g. /css/foo.css > > w/o > > >> a > > >> > > >>> context: prefix) path to the css in the layout; as a result, > all > > >> of > > >> > the > > >> > > >>> "other" css (using yaml for layout) and the images referenced > by > > >> the > > >> > > main > > >> > > >>> css depend on the asset service (e.g. > > >> > > >>> > > >> > > >>> > > >> > > >>> > > >> > > > > >> > > > >> > > > http://zadachite-dev.appspot.com/assets/ctx/91328db67ddf7725/images/layout_v2/footer.jpg > > >> > > >>> ) > > >> > > >>> instead of just being loaded as static files. I was thinking > > that > > >> > > >>> switching > > >> > > >>> the reference to the main stylesheet to not be a context: > > >> reference > > >> > and > > >> > > >>> marking the web app context resources as static (in the GAE > web > > >> > config > > >> > > >>> file) > > >> > > >>> might resolve the issue. > > >> > > >>> > > >> > > >>> So, here's an example : > > >> > > >>> 1. go to http://zadachite-dev.appspot.com (this is the "dev" > > >> version > > >> > > >>> which > > >> > > >>> is unlikely to be warm right now) > > >> > > >>> > > >> > > >>> 2. Upon the initial loading of the pages, some of the graphics > > >> (more > > >> > or > > >> > > >>> less > > >> > > >>> randomly) or stylesheets don't return as they get 404s: > > >> > > >>> > > >> > > >>> <html><head> > > >> > > >>> <meta http-equiv="content-type" > > content="text/html;charset=utf-8"> > > >> > > >>> <title>404 Unable to locate asset > > >> > > >>> 'classpath:ctx/91328db67ddf7725/yaml/core/base.css' (the file > > does > > >> > not > > >> > > >>> exist).</title> > > >> > > >>> </head> > > >> > > >>> <body text=#000000 bgcolor=#ffffff> > > >> > > >>> <h1>Error: Unable to locate asset > > >> > > >>> 'classpath:ctx/91328db67ddf7725/yaml/core/base.css' (the file > > does > > >> > not > > >> > > >>> exist).</h1> > > >> > > >>> </body></html> > > >> > > >>> > > >> > > >>> > > >> > > >>> or for images, it's a straight 404 w/o any further response. > > >> > > >>> > > >> > > >>> 3. Browse to some of the other pages of the site - one by one, > > the > > >> > > >>> "missing" > > >> > > >>> assets start showing up one by one and eventually the layout > > >> renders > > >> > > >>> correctly. After the app is "warmed up" now, even if you > refresh > > >> the > > >> > > page > > >> > > >>> including the initially cached assets, they load fine. > > >> > > >>> -- > > >> > > >>> View this message in context: > > >> > > >>> > > >> > > >>> > > >> > > > > >> > > > >> > > > http://old.nabble.com/Asset-service-issues-in-GAE-tp28219164p28219164.html > > >> > > >>> Sent from the Tapestry - User mailing list archive at > > Nabble.com. > > >> > > >>> > > >> > > >>> > > >> > > >>> > > >> --------------------------------------------------------------------- > > >> > > >>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > > >> > > >>> For additional commands, e-mail: > users-h...@tapestry.apache.org > > >> > > >>> > > >> > > >>> > > >> > > >>> > > >> > > >>> > > >> > > >> > > >> > > >> > > >> > > > > > >> > > > > > >> --------------------------------------------------------------------- > > >> > > > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > > >> > > > For additional commands, e-mail: users-h...@tapestry.apache.org > > >> > > > > > >> > > > > > >> > > > > >> > > > >> > > > >> > > > >> > -- > > >> > Dmitry Gusev > > >> > > > >> > AnjLab Team > > >> > http://anjlab.com > > >> > > > >> > > > > > > > > > > > > -- > > > Dmitry Gusev > > > > > > AnjLab Team > > > http://anjlab.com > > > > > > > > > > > -- > > Dmitry Gusev > > > > AnjLab Team > > http://anjlab.com > > > -- Dmitry Gusev AnjLab Team http://anjlab.com