Re: freemarker Struts 2 Thread Lock Issue
Attila Szegedi <[email protected]>
| Newsgroups | gmane.comp.web.freemarker.user |
|---|---|
| Message-ID | <[email protected]> |
Yup, I fixed a lot of problems in caching concurrent performance in 2.3.13, it's worth upgrading to latest. Struts2 seems to be stuck in shipping 2.3.8 for ages. Attila. On 2009.05.20., at 12:24, Santosh Sharma wrote: > Hi Daniel , > > I m using version 3.2.8 . I looked at Freemarker site and they have > done a lot of fixes in cache in version 3.2.13 . I m upgrading to > latest 3.2.15 and will test with new version . > > Thanks > San > -----Daniel Dekany <[email protected]> wrote: ----- > > To: sanrosh95 <[email protected]> > From: Daniel Dekany <[email protected]> > Date: 05/20/2009 11:14AM > cc: [email protected] > Subject: Re: [FreeMarker-user] freemarker Struts 2 Thread Lock Issue > > Wednesday, May 20, 2009, 4:47:23 PM, sanrosh95 wrote: > > > > Hi , > > > > Is there a way to disable the caching in Freemarker > > Setting maximum cache size to 0 ("cache_storage" setting to > ""strong:0, soft:0"") should do that effectively (I didn't tried it) > or to plug-in a dummy freemarker.cache.CacheStorage implementation > with the sme setting (use a value like > "com.example.YourDummyCacheStorage"). > > > and what will be its impact on Performance . > > It has serious performance impact, as without cache getting a template > includes reading it from the HDD (or from the OS disk cache, of > course...) plus parsing the template to Abstract Syntax Tree. > > > I Saw a lot of threads hanging with below kind of stack . > > That's a can easily be a critical bug if it's indeed the mistake of > FreeMarker... What FreeMarker version does ${.version} print? > > > Thanks > > San > > > > "ExecuteThread: '22' for queue: 'default'" daemon prio=5 > tid=0x00286df8 > > nid=0x20 waiting for monitor entry [0x655f9000..0x655ffc30] > > at > > freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:245) > > - waiting to lock <0x959b51d0> (a > freemarker.cache.MruCacheStorage) > > at > > freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:229) > > at > > freemarker.template.Configuration.getTemplate(Configuration.java: > 487) > > at > > > freemarker.core.Environment.getTemplateForInclusion(Environment.java: > 1357) > > at freemarker.core.Include.accept(Include.java:143) > > at freemarker.core.Environment.visit(Environment.java:196) > > at freemarker.core.MixedContent.accept(MixedContent.java:92) > > at freemarker.core.Environment.visit(Environment.java:196) > > at freemarker.core.Environment.process(Environment.java:176) > > at freemarker.template.Template.process(Template.java:232) > > at > > > org > .apache > .struts2 > .components > .template > .FreemarkerTemplateEngine > .renderTemplate(FreemarkerTemplateEngine.java:168) > > at > > org.apache.struts2.components.UIBean.mergeTemplate(UIBean.java:530) > > at > > > org.apache.struts2.components.ClosingUIBean.start(ClosingUIBean.java: > 58) > > at > > > org > .apache > .struts2 > .views.jsp.ComponentTagSupport.doStartTag(ComponentTagSupport.java:54) > > at > > > jsp_servlet > ._portlet._jsp.__DisplayPortlet._jspService(__DisplayPortlet.java:286) > > at weblogic.servlet.jsp.JspBase.service(JspBase.java:33) > > at > > weblogic.servlet.internal.ServletStubImpl > $ServletInvocationAction.run(ServletStubImpl.java:1006) > > at > > > weblogic > .servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java: > 419) > > at > > weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > com > .sherwin > .portal > .user.action.AuthenticationFilter.doFilter(AuthenticationFilter.java: > 259) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > org > .displaytag > .filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java: > 125) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > weblogic > .servlet > .internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java: > 644) > > at > > > weblogic > .servlet > .internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java: > 423) > > at > > > org > .apache > .struts2 > .dispatcher > .ServletDispatcherResult.doExecute(ServletDispatcherResult.java:141) > > at > > > org > .apache > .struts2 > .dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:178) > > at > > > com > .opensymphony > .xwork2 > .DefaultActionInvocation.executeResult(DefaultActionInvocation.java: > 348) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 253) > > at > > > com > .opensymphony > .xwork2 > .interceptor > .DefaultWorkflowInterceptor > .doIntercept(DefaultWorkflowInterceptor.java:221) > > at > > > com > .opensymphony > .xwork2 > .interceptor > .MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > com > .opensymphony > .xwork2 > .validator > .ValidationInterceptor.doIntercept(ValidationInterceptor.java:150) > > at > > > org > .apache > .struts2 > .interceptor > .validation > .AnnotationValidationInterceptor > .doIntercept(AnnotationValidationInterceptor.java:48) > > at > > > com > .opensymphony > .xwork2 > .interceptor > .MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > com > .opensymphony > .xwork2 > .interceptor > .ConversionErrorInterceptor > .intercept(ConversionErrorInterceptor.java:123) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > com > .opensymphony > .xwork2 > .interceptor > .ParametersInterceptor.doIntercept(ParametersInterceptor.java:184) > > at > > > com > .opensymphony > .xwork2 > .interceptor > .MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > com > .opensymphony > .xwork2 > .interceptor > .StaticParametersInterceptor > .intercept(StaticParametersInterceptor.java:105) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > org > .apache > .struts2 > .interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java: > 83) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > org > .apache > .struts2 > .interceptor > .FileUploadInterceptor.intercept(FileUploadInterceptor.java:207) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > com > .opensymphony > .xwork2 > .interceptor > .ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > com > .opensymphony > .xwork2 > .interceptor > .ScopedModelDrivenInterceptor > .intercept(ScopedModelDrivenInterceptor.java:127) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > org > .apache > .struts2 > .interceptor > .ProfilingActivationInterceptor > .intercept(ProfilingActivationInterceptor.java:107) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > org > .apache > .struts2 > .interceptor > .debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java: > 206) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > com > .opensymphony > .xwork2 > .interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java: > 115) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > com > .opensymphony > .xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java: > 143) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > com > .opensymphony > .xwork2 > .interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java: > 121) > > at > > > com > .opensymphony > .xwork2 > .interceptor > .MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > org > .apache > .struts2 > .interceptor > .ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > com > .opensymphony > .xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java: > 123) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > com > .opensymphony > .xwork2 > .interceptor > .ExceptionMappingInterceptor > .intercept(ExceptionMappingInterceptor.java:176) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:224) > > at > > com.opensymphony.xwork2.DefaultActionInvocation > $2.doProfiling(DefaultActionInvocation.java:223) > > at > > > com > .opensymphony > .xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) > > at > > > com > .opensymphony > .xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: > 221) > > at > > > org > .apache > .struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50) > > at > > > org > .apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java: > 504) > > at > > > org > .apache > .struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java: > 422) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > weblogic > .servlet > .internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java: > 644) > > at > > > weblogic > .servlet > .internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java: > 423) > > at > > weblogic.servlet.jsp.PageContextImpl.include(PageContextImpl.java: > 154) > > at jsp_servlet._main.__home_sw._jspService(__home_sw.java: > 171) > > at weblogic.servlet.jsp.JspBase.service(JspBase.java:33) > > at > > weblogic.servlet.internal.ServletStubImpl > $ServletInvocationAction.run(ServletStubImpl.java:1006) > > at > > > weblogic > .servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java: > 419) > > at > > weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > com > .sherwin > .portal > .user.action.AuthenticationFilter.doFilter(AuthenticationFilter.java: > 259) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > org > .displaytag > .filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java: > 125) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > weblogic > .servlet > .internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java: > 644) > > at > > > weblogic > .servlet > .internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java: > 423) > > at > > weblogic.servlet.jsp.PageContextImpl.include(PageContextImpl.java: > 154) > > at jsp_servlet._main.__main._jspService(__main.java:1473) > > at weblogic.servlet.jsp.JspBase.service(JspBase.java:33) > > at > > weblogic.servlet.internal.ServletStubImpl > $ServletInvocationAction.run(ServletStubImpl.java:1006) > > at > > > weblogic > .servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java: > 419) > > at > > weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > com > .sherwin > .portal > .user.action.AuthenticationFilter.doFilter(AuthenticationFilter.java: > 259) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > org > .displaytag > .filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java: > 125) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > weblogic > .servlet > .internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java: > 326) > > at > > > org > .apache > .struts.action.RequestProcessor.doForward(RequestProcessor.java:1063) > > at > > > org > .apache > .struts > .action.RequestProcessor.processForwardConfig(RequestProcessor.java: > 386) > > at > > > org > .apache.struts.action.RequestProcessor.process(RequestProcessor.java: > 229) > > at > > org.apache.struts.action.ActionServlet.process(ActionServlet.java: > 1194) > > at > > org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414) > > at > > javax.servlet.http.HttpServlet.service(HttpServlet.java:740) > > at > > javax.servlet.http.HttpServlet.service(HttpServlet.java:853) > > at > > weblogic.servlet.internal.ServletStubImpl > $ServletInvocationAction.run(ServletStubImpl.java:1006) > > at > > > weblogic > .servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java: > 419) > > at > > weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > com > .sherwin > .portal > .user.action.AuthenticationFilter.doFilter(AuthenticationFilter.java: > 259) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > org > .displaytag > .filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java: > 125) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > weblogic > .servlet > .internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java: > 326) > > at > > > org > .apache > .struts.action.RequestProcessor.doForward(RequestProcessor.java:1063) > > at > > > org > .apache > .struts > .action.RequestProcessor.processForwardConfig(RequestProcessor.java: > 386) > > at > > > org > .apache.struts.action.RequestProcessor.process(RequestProcessor.java: > 229) > > at > > org.apache.struts.action.ActionServlet.process(ActionServlet.java: > 1194) > > at > > org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414) > > at > > javax.servlet.http.HttpServlet.service(HttpServlet.java:740) > > at > > javax.servlet.http.HttpServlet.service(HttpServlet.java:853) > > at > > weblogic.servlet.internal.ServletStubImpl > $ServletInvocationAction.run(ServletStubImpl.java:1006) > > at > > > weblogic > .servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java: > 419) > > at > > weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > com > .sherwin > .portal > .user.action.AuthenticationFilter.doFilter(AuthenticationFilter.java: > 259) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > > org > .displaytag > .filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java: > 125) > > at > > > weblogic > .servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27) > > at > > weblogic.servlet.internal.WebAppServletContext > $ServletInvocationAction.run(WebAppServletContext.java:6724) > > at > > > weblogic > .security > .acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) > > at > > > weblogic.security.service.SecurityManager.runAs(SecurityManager.java: > 121) > > at > > > weblogic > .servlet > .internal > .WebAppServletContext.invokeServlet(WebAppServletContext.java:3764) > > at > > > weblogic > .servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java: > 2644) > > at > > weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219) > > at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178) > > -- > Best regards, > Daniel Dekany ------------------------------------------------------------------------------ Crystal Reports - New Free Runtime and 30 Day Trial Check out the new simplified licensing option that enables unlimited royalty-free distribution of the report engine for externally facing server and web deployment. http://p.sf.net/sfu/businessobjects