是什么导致速度Template.merge()失败?如何避免呢?

时间:2020-03-05 18:56:36  来源:igfitidea点击:

我们的团队一直在遇到速度模板问题。渲染后,有些人抛出RuntimeException并显示消息" Template.merge()failure无法渲染Velocity模板'/template.vm'"。我们无法重现该问题,并且网络上的文档还远远不够。问题是不能始终如一地再现相同的模板,这些模板的渲染有时会导致错误,并且在其他时间也可以毫无问题地显示出来。 Template类的源代码也几乎没有帮助。先感谢我们。

编辑:基于Nathan Bubna的回复,我需要澄清一下,我们使用的是Velocity 1.4版。

编辑:由于有人指出堆栈跟踪将是有益的,这里是:

2008-09-15 11:07:57,336错误速度Speed.Template.merge()失败。该文档为空,很可能是由于解析错误。
2008-09-15 11:07:57,336错误VelocityResult无法呈现Velocity模板," / search / [template-redacted] .vm"
java.lang.Exception:Template.merge()失败。该文档为空,很可能是由于解析错误。
在org.apache.velocity.Template.merge(Template.java:277)
在com.opensymphony.webwork.dispatcher.VelocityResult.doExecute(VelocityResult.java:91)
在com.opensymphony.webwork.dispatcher.WebWorkResultSupport.execute(WebWorkResultSupport.java:109)
在com.opensymphony.xwork.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:258)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:182)
在com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
在com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
在com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
在com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
在com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
在com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
在com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:164)
在com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:116)
在com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:272)
在com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:237)
在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)

解决方案

回答

在com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:39)
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
在org.nanocontainer.nanowar.webwork2.PicoObjectFactoryFilter.doFilter(PicoObjectFactoryFilter.java:46)
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
在org.nanocontainer.nanowar.ServletRequestContainerFilter.doFilter(ServletRequestContainerFilter.java:44)
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
在com.bostoncapital.stuyvesant.RememberUserNameFilter.doFilter(RememberUserNameFilter.java:30)
在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:214)
在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
在org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:526)
在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:825)
在org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.processConnection(Http11Protocol.java:738)
在org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:526)
在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(未知来源)

回答

由于源中的注释已经说明了这种情况不应该发生,因此我认为这是Template软件中的错误。向编写该错误的人提交错误报告。

我们需要获取RuntimeException及其原因的完整堆栈跟踪。

回答

请编辑答案以添加该信息。

回答

我已经通过电子邮件发送了代码的作者,以查看他们是否可以提供一些见解。我将确保分享我学到的任何东西。

我们正在使用什么版本的Velocity?导致此问题的是旧版本中的某些竞争条件。大多数都被压缩在Velocity 1.5版本中。虽然我个人建议使用Velocity 1.6-beta1. 它极大地提高了性能(内存和速度),并修复了许多小错误,这些错误未将其提高到1.5.

回答

编辑:由于我们说我们正在使用1.4,那么,是的,我确定这是我们修复的比赛条件。请考虑升级。 1.6绝对是我们最好的选择,因为它可以修复错误并提高性能。 1.6决赛应该很快出来。

我现在正在我们的网站上处理同一错误。

它似乎确实是一个竞争条件:我可以使用多个进程读取同一页来一致地重现它,但是如果我对请求进行序列化,则永远不会重现它。

我正在使用Velocity-1.5;我尝试迁移到1.6-beta1,但看到其他错误。

段落数量不匹配