Hi I finally updated the test case for tapestry.
In my opinion, the test case now is fair and can be used in the comparison. Unfortunately I was not able to get rid the error about "java.io.IOException: Not in GZIP format" but since it only appears at application startup, and later in the experiment it dissapear, it will not affect the benchmark in a significative way. Could somebody take a look at it and tell me if it is ok or not? I also applied all performance flags suggested (tapestry.production-mode = true). regards, Leonardo Uribe 2012/9/5 Leonardo Uribe <[email protected]>: > Hi > > It seems there reply was not sent to dev list. Here it is: > > 2012/9/5 Thiago H de Paula Figueiredo <[email protected]>: >> On Wed, 05 Sep 2012 16:45:33 -0300, Leonardo Uribe <[email protected]> wrote: >> >>> Hi >> >> >> Hi! >> >>> >>> For some time, I have been working on create a fair and accurate >>> comparison between different web frameworks. >>> >>> I have been trying to update a tapestry simple booking demo app to >>> version 5.3.5 (it was written originally for 5.1.0.5). It is located >>> here: >>> >>> >>> https://github.com/lu4242/performance-comparison-java-web-frameworks/tree/master/perfbench-code/tapestry-jpa >> >> >> You're doing something in >> https://github.com/lu4242/performance-comparison-java-web-frameworks/blob/master/perfbench-code/tapestry-jpa/src/main/java/tapestryjpa/web/BookingSession.java >> which someone with more Tapestry experience would never do: stuff a list of >> objects from the database in the session. I'll try to do a push request in >> the weekend with changes to make the code look more Tapestry-like. That's my >> guess on why Tapestry, which doesn't store render state in the session, uses >> roughly the same amount of memory as Wicket, which does store render state >> in the session, in this comparison: >> http://ptrthomas.wordpress.com/2009/09/14/perfbench-update-tapestry-5-and-grails/ >> > > The code comes from that blog, but my objective is do the comparison > in the right way. In theory, it is better to keep the business model > the same, even if is not optimal. In that way, the only thing that > changes is the one related to the framework. Anyway, it sounds better > to fix that part, to reflect the way people using Tapestry use to do > it. > > Any suggestion or improvement you can do will be a big help. Thanks a lot. > >>> 1. Is the exception a known problem? How to solve it? I already tried >>> set tapestry.gzip-compression-enabled to false and it does not work. >>> 2. Does anybody know which flags or config params needs to be enabled >>> for optimal performance? >> >> >> Basically, tapestry.production-mode = true should suffice. >> > > Ok, good to know that. > >>> 3. Does anybody know how to do server side validation over one field + >>> ajax? the example does not have that part, and unfortunately I don't >>> know how to do it properly (the idea is compare how ajax performs for >>> each framework). >> >> >> Does it need to be field per field or can it be whole form at once? If the >> latter, just use an AJAX form submission. If not, we need to create a custom >> event with ComponentResources.createEventLink() and invoke it using a little >> bit of JavaScript. >> > > It is necessary the validation for only two fields (BookPage.tml > "Credit Card #:" and "Credit Card Name:". This is how is done with JSF 2: > > <div class="entry"> > <div class="label"><h:outputLabel id="CreditCardLabel" > for="creditCard">Credit Card #:</h:outputLabel></div> > <div class="input"> > <h:panelGroup id="creditCardDecorate"> > <h:inputText id="creditCard" > value="#{hotelBooking.booking.creditCard}" required="true"> > <f:ajax event="blur" render="creditCardDecorate"/> > </h:inputText> > <h:panelGroup layout="block"> > <h:message for="creditCard" errorClass="errors"/> > </h:panelGroup> > </h:panelGroup> > </div> > </div> > > The idea is an outer panel (creditCardDecorate) that is rendered using > ajax when some text is entered in the input field and the onblur event > is activated (the input text loses focus). The visible effect is if > there is a validation error, a new message is added below the input > text. > > In few words the idea is just do server side validation over one field > and update the result using ajax. It does not matter if the update is > for all the field including the message (preferred), or just for the > message box, the effect should be the same. The idea is see how the > framework is able to deal with ajax. > > Really my understanding of Tapestry is very poor, so I don't really > know how to do it properly. Any help in this part will be most > welcome. > > best regards, > > Leonardo Uribe > > > 2012/9/5 Leonardo Uribe <[email protected]>: >> Hi >> >> For some time, I have been working on create a fair and accurate >> comparison between different web frameworks. >> >> I have been trying to update a tapestry simple booking demo app to >> version 5.3.5 (it was written originally for 5.1.0.5). It is located >> here: >> >> https://github.com/lu4242/performance-comparison-java-web-frameworks/tree/master/perfbench-code/tapestry-jpa >> >> To test how it works under concurrency, I created a proper jmeter test >> case here: >> >> https://github.com/lu4242/performance-comparison-java-web-frameworks/blob/master/perfbench-code/tapestry-jpa/src/test/jmeter/booking-jmeter-direct.jmx >> >> If you run the app manually it works correctly. The problem starts >> when you try it under an specific load. >> >> At start it works fine, but after some time (30 seconds more or less, >> in a periodic fashion), an exception is thrown (see it at the end of >> the mail). >> >> Here are my questions: >> >> 1. Is the exception a known problem? How to solve it? I already tried >> set tapestry.gzip-compression-enabled to false and it does not work. >> 2. Does anybody know which flags or config params needs to be enabled >> for optimal performance? >> 3. Does anybody know how to do server side validation over one field + >> ajax? the example does not have that part, and unfortunately I don't >> know how to do it properly (the idea is compare how ajax performs for >> each framework). >> >> Suggestions are most welcome. >> >> regards, >> >> Leonardo Uribe >> >> org.apache.tapestry5.ioc.internal.OperationException: For input >> string: "" [at context:BookPage.tml, line 32] >> at >> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.logAndRethrow(OperationTrackerImpl.java:121) >> at >> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:88) >> at >> org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) >> at >> org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementResourcesImpl.invoke(ComponentPageElementResourcesImpl.java:146) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl.triggerContextEvent(ComponentPageElementImpl.java:1053) >> at >> org.apache.tapestry5.internal.services.ComponentEventRequestHandlerImpl.handle(ComponentEventRequestHandlerImpl.java:81) >> at >> org.apache.tapestry5.internal.services.ImmediateActionRenderResponseFilter.handle(ImmediateActionRenderResponseFilter.java:42) >> at $ComponentEventRequestHandler_d8469a0713c.handle(Unknown Source) >> at >> org.apache.tapestry5.internal.services.AjaxFilter.handle(AjaxFilter.java:42) >> at $ComponentEventRequestHandler_d8469a0713c.handle(Unknown Source) >> at >> org.apache.tapestry5.services.TapestryModule$41.handle(TapestryModule.java:2472) >> at $ComponentEventRequestHandler_d8469a0713c.handle(Unknown Source) >> at $ComponentEventRequestHandler_d8469a0707e.handle(Unknown Source) >> at >> org.apache.tapestry5.internal.services.ComponentRequestHandlerTerminator.handleComponentEvent(ComponentRequestHandlerTerminator.java:43) >> at >> org.apache.tapestry5.services.InitializeActivePageName.handleComponentEvent(InitializeActivePageName.java:39) >> at $ComponentRequestHandler_d8469a07080.handleComponentEvent(Unknown >> Source) >> at $ComponentRequestHandler_d8469a07046.handleComponentEvent(Unknown >> Source) >> at >> org.apache.tapestry5.internal.services.ComponentEventDispatcher.dispatch(ComponentEventDispatcher.java:46) >> at $Dispatcher_d8469a0704a.dispatch(Unknown Source) >> at $Dispatcher_d8469a07043.dispatch(Unknown Source) >> at >> org.apache.tapestry5.services.TapestryModule$RequestHandlerTerminator.service(TapestryModule.java:302) >> at >> org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26) >> at $RequestHandler_d8469a07044.service(Unknown Source) >> at >> org.apache.tapestry5.services.TapestryModule$3.service(TapestryModule.java:902) >> at $RequestHandler_d8469a07044.service(Unknown Source) >> at >> org.apache.tapestry5.services.TapestryModule$2.service(TapestryModule.java:892) >> at $RequestHandler_d8469a07044.service(Unknown Source) >> at >> org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:90) >> at $RequestHandler_d8469a07044.service(Unknown Source) >> at $RequestHandler_d8469a0703c.service(Unknown Source) >> at >> org.apache.tapestry5.services.TapestryModule$HttpServletRequestHandlerTerminator.service(TapestryModule.java:253) >> at >> org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62) >> at $HttpServletRequestFilter_d8469a0703a.service(Unknown Source) >> at $HttpServletRequestHandler_d8469a0703e.service(Unknown Source) >> at >> org.apache.tapestry5.services.TapestryModule$1.service(TapestryModule.java:852) >> at $HttpServletRequestHandler_d8469a0703e.service(Unknown Source) >> at $HttpServletRequestHandler_d8469a07039.service(Unknown Source) >> at >> org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:171) >> at >> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) >> at >> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) >> at >> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) >> at >> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) >> at >> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) >> at >> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) >> at >> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) >> at >> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) >> at >> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) >> at >> org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) >> at >> org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) >> at >> org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) >> at >> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) >> at >> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) >> at java.lang.Thread.run(Thread.java:662) >> Caused by: org.apache.tapestry5.runtime.ComponentEventException: For >> input string: "" [at context:BookPage.tml, line 32] >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl.processEventTriggering(ComponentPageElementImpl.java:1136) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl.access$3100(ComponentPageElementImpl.java:61) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl$5.invoke(ComponentPageElementImpl.java:1057) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl$5.invoke(ComponentPageElementImpl.java:1054) >> at >> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) >> ... 52 more >> Caused by: org.apache.tapestry5.ioc.internal.util.TapestryException: >> For input string: "" [at context:BookPage.tml, line 39] >> at >> org.apache.tapestry5.corelib.components.Form.executeStoredActions(Form.java:672) >> at >> org.apache.tapestry5.corelib.components.Form.advised$onAction_d8469a070a9(Form.java:522) >> at >> org.apache.tapestry5.corelib.components.Form$Invocation_onAction_d8469a070a8.proceedToAdvisedMethod(Unknown >> Source) >> at >> org.apache.tapestry5.internal.plastic.AbstractMethodInvocation.proceed(AbstractMethodInvocation.java:84) >> at >> org.apache.tapestry5.ioc.internal.services.LoggingAdvice.advise(LoggingAdvice.java:37) >> at >> org.apache.tapestry5.internal.plastic.AbstractMethodInvocation.proceed(AbstractMethodInvocation.java:86) >> at org.apache.tapestry5.corelib.components.Form.onAction(Form.java) >> at >> org.apache.tapestry5.corelib.components.Form.dispatchComponentEvent(Form.java) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl.dispatchEvent(ComponentPageElementImpl.java:927) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl.processEventTriggering(ComponentPageElementImpl.java:1112) >> ... 56 more >> Caused by: java.lang.NumberFormatException: For input string: "" >> at >> java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) >> at java.lang.Long.parseLong(Long.java:431) >> at java.lang.Long.parseLong(Long.java:468) >> at java.text.DigitList.getLong(DigitList.java:177) >> at java.text.DecimalFormat.parse(DecimalFormat.java:1297) >> at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1590) >> at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1311) >> at java.text.DateFormat.parse(DateFormat.java:335) >> at >> org.apache.tapestry5.corelib.components.DateField.processSubmission(DateField.java:277) >> at >> org.apache.tapestry5.corelib.base.AbstractField.processSubmission(AbstractField.java:193) >> at >> org.apache.tapestry5.corelib.base.AbstractField.access$100(AbstractField.java:37) >> at >> org.apache.tapestry5.corelib.base.AbstractField$ProcessSubmission.execute(AbstractField.java:95) >> at >> org.apache.tapestry5.corelib.base.AbstractField$ProcessSubmission.execute(AbstractField.java:89) >> at >> org.apache.tapestry5.corelib.components.Form.executeStoredActions(Form.java:661) >> ... 65 more >> [http-bio-8080-exec-31] ERROR [org.apache.tapestry5.ioc.Registry] >> java.io.IOException: Not in GZIP format >> [http-bio-8080-exec-31] ERROR [org.apache.tapestry5.ioc.Registry] >> Operations trace: >> [http-bio-8080-exec-31] ERROR [org.apache.tapestry5.ioc.Registry] [ 1] >> Triggering event 'action' on ConfirmPage:form >> [http-bio-8080-exec-31] ERROR >> [org.apache.tapestry5.services.TapestryModule.RequestExceptionHandler] >> Processing of request failed with uncaught exception: >> java.io.IOException: Not in GZIP format >> org.apache.tapestry5.ioc.internal.OperationException: >> java.io.IOException: Not in GZIP format [at context:ConfirmPage.tml, >> line 44] >> at >> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.logAndRethrow(OperationTrackerImpl.java:121) >> at >> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:88) >> at >> org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) >> at >> org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementResourcesImpl.invoke(ComponentPageElementResourcesImpl.java:146) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl.triggerContextEvent(ComponentPageElementImpl.java:1053) >> at >> org.apache.tapestry5.internal.services.ComponentEventRequestHandlerImpl.handle(ComponentEventRequestHandlerImpl.java:81) >> at >> org.apache.tapestry5.internal.services.ImmediateActionRenderResponseFilter.handle(ImmediateActionRenderResponseFilter.java:42) >> at $ComponentEventRequestHandler_d8469a0713c.handle(Unknown Source) >> at >> org.apache.tapestry5.internal.services.AjaxFilter.handle(AjaxFilter.java:42) >> at $ComponentEventRequestHandler_d8469a0713c.handle(Unknown Source) >> at >> org.apache.tapestry5.services.TapestryModule$41.handle(TapestryModule.java:2472) >> at $ComponentEventRequestHandler_d8469a0713c.handle(Unknown Source) >> at $ComponentEventRequestHandler_d8469a0707e.handle(Unknown Source) >> at >> org.apache.tapestry5.internal.services.ComponentRequestHandlerTerminator.handleComponentEvent(ComponentRequestHandlerTerminator.java:43) >> at >> org.apache.tapestry5.services.InitializeActivePageName.handleComponentEvent(InitializeActivePageName.java:39) >> at $ComponentRequestHandler_d8469a07080.handleComponentEvent(Unknown >> Source) >> at $ComponentRequestHandler_d8469a07046.handleComponentEvent(Unknown >> Source) >> at >> org.apache.tapestry5.internal.services.ComponentEventDispatcher.dispatch(ComponentEventDispatcher.java:46) >> at $Dispatcher_d8469a0704a.dispatch(Unknown Source) >> at $Dispatcher_d8469a07043.dispatch(Unknown Source) >> at >> org.apache.tapestry5.services.TapestryModule$RequestHandlerTerminator.service(TapestryModule.java:302) >> at >> org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26) >> at $RequestHandler_d8469a07044.service(Unknown Source) >> at >> org.apache.tapestry5.services.TapestryModule$3.service(TapestryModule.java:902) >> at $RequestHandler_d8469a07044.service(Unknown Source) >> at >> org.apache.tapestry5.services.TapestryModule$2.service(TapestryModule.java:892) >> at $RequestHandler_d8469a07044.service(Unknown Source) >> at >> org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:90) >> at $RequestHandler_d8469a07044.service(Unknown Source) >> at $RequestHandler_d8469a0703c.service(Unknown Source) >> at >> org.apache.tapestry5.services.TapestryModule$HttpServletRequestHandlerTerminator.service(TapestryModule.java:253) >> at >> org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62) >> at $HttpServletRequestFilter_d8469a0703a.service(Unknown Source) >> at $HttpServletRequestHandler_d8469a0703e.service(Unknown Source) >> at >> org.apache.tapestry5.services.TapestryModule$1.service(TapestryModule.java:852) >> at $HttpServletRequestHandler_d8469a0703e.service(Unknown Source) >> at $HttpServletRequestHandler_d8469a07039.service(Unknown Source) >> at >> org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:171) >> at >> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) >> at >> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) >> at >> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) >> at >> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) >> at >> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) >> at >> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) >> at >> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) >> at >> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) >> at >> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) >> at >> org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) >> at >> org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) >> at >> org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) >> at >> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) >> at >> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) >> at java.lang.Thread.run(Thread.java:662) >> Caused by: org.apache.tapestry5.runtime.ComponentEventException: >> java.io.IOException: Not in GZIP format [at context:ConfirmPage.tml, >> line 44] >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl.processEventTriggering(ComponentPageElementImpl.java:1136) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl.access$3100(ComponentPageElementImpl.java:61) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl$5.invoke(ComponentPageElementImpl.java:1057) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl$5.invoke(ComponentPageElementImpl.java:1054) >> at >> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) >> ... 52 more >> Caused by: org.apache.tapestry5.ioc.internal.util.TapestryException: >> java.io.IOException: Not in GZIP format >> at >> org.apache.tapestry5.corelib.components.Form.executeStoredActions(Form.java:672) >> at >> org.apache.tapestry5.corelib.components.Form.advised$onAction_d8469a070a9(Form.java:522) >> at >> org.apache.tapestry5.corelib.components.Form$Invocation_onAction_d8469a070a8.proceedToAdvisedMethod(Unknown >> Source) >> at >> org.apache.tapestry5.internal.plastic.AbstractMethodInvocation.proceed(AbstractMethodInvocation.java:84) >> at >> org.apache.tapestry5.ioc.internal.services.LoggingAdvice.advise(LoggingAdvice.java:37) >> at >> org.apache.tapestry5.internal.plastic.AbstractMethodInvocation.proceed(AbstractMethodInvocation.java:86) >> at org.apache.tapestry5.corelib.components.Form.onAction(Form.java) >> at >> org.apache.tapestry5.corelib.components.Form.dispatchComponentEvent(Form.java) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl.dispatchEvent(ComponentPageElementImpl.java:927) >> at >> org.apache.tapestry5.internal.structure.ComponentPageElementImpl.processEventTriggering(ComponentPageElementImpl.java:1112) >> ... 56 more >> Caused by: java.lang.RuntimeException: java.io.IOException: Not in GZIP >> format >> at >> org.apache.tapestry5.internal.services.ClientDataEncoderImpl.decodeClientData(ClientDataEncoderImpl.java:62) >> at $ClientDataEncoder_d8469a070a7.decodeClientData(Unknown Source) >> at >> org.apache.tapestry5.corelib.components.Form.executeStoredActions(Form.java:650) >> ... 65 more >> Caused by: java.io.IOException: Not in GZIP format >> at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:141) >> at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:56) >> at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:65) >> at >> org.apache.tapestry5.internal.services.ClientDataEncoderImpl.decodeClientData(ClientDataEncoderImpl.java:55) >> ... 67 more --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
