Quelles sont les causes d'une défaillance de Velocity Template.merge ()? Comment on l'évite?

StackOverflow https://stackoverflow.com/questions/74818

  •  09-06-2019
  •  | 
  •  

Question

Notre équipe a rencontré un problème récurrent avec les modèles de vélocité. Lors du rendu, certains émettent une exception RuntimeException avec le message "Echec de Template.merge () - Impossible de restituer le modèle de vélocité, '/template.vm'" ;. Nous n'avons pas été en mesure de reproduire le problème et la documentation sur le Web est plutôt insuffisante. Le problème n'est pas toujours reproductible - les mêmes modèles dont le rendu provoque parfois l'erreur parviennent également à s'afficher sans problème à d'autres moments. La classe de modèle le code source est également d'une aide précieuse. . Merci d'avance.

Éditer: d'après la réponse de Nathan Bubna, je dois préciser que nous utilisons Velocity version 1.4.

Edit: Puisqu'il a été signalé qu'une trace de pile serait bénéfique, la voici:

2008-09-15 11: 07: 57,336 ERREUR vélocité - échec de Template.merge (). Le document est nul, probablement en raison d'une erreur d'analyse. 2008-09-15 11: 07: 57,336 ERREUR VelocityResult - Impossible de restituer le modèle de vélocité, '/search/[template-redacted].vm' java.lang.Exception: échec de Template.merge (). Le document est nul, probablement en raison d'une erreur d'analyse.     à org.apache.velocity.Template.merge (Template.java:277)     à com.opensymphony.webwork.dispatcher.VelocityResult.doExecute (VelocityResult.java:91)     sur com.opensymphony.webwork.dispatcher.WebWorkResultSupport.execute (WebWorkResultSupport.java:109)     at com.opensymphony.xwork.DefaultActionInvocation.executeResult (DefaultActionInvocation.java:258)     à l'adresse com.opensymphony.xwork.DefaultActionInvocation.invoke (DefaultActionInvocation.java:182)     sur com.opensymphony.xwork.interceptor.AroundInterceptor.intercept (AroundInterceptor.java:35)     à l'adresse com.opensymphony.xwork.DefaultActionInvocation.invoke (DefaultActionInvocation.java:164)     sur com.opensymphony.xwork.interceptor.AroundInterceptor.intercept (AroundInterceptor.java:35)     à l'adresse com.opensymphony.xwork.DefaultActionInvocation.invoke (DefaultActionInvocation.java:164)     sur com.opensymphony.xwork.interceptor.AroundInterceptor.intercept (AroundInterceptor.java:35)     à l'adresse com.opensymphony.xwork.DefaultActionInvocation.invoke (DefaultActionInvocation.java:164)     sur com.opensymphony.xwork.interceptor.AroundInterceptor.intercept (AroundInterceptor.java:35)     à l'adresse com.opensymphony.xwork.DefaultActionInvocation.invoke (DefaultActionInvocation.java:164)     sur com.opensymphony.xwork.interceptor.AroundInterceptor.intercept (AroundInterceptor.java:35)     à l'adresse com.opensymphony.xwork.DefaultActionInvocation.invoke (DefaultActionInvocation.java:164)     sur com.opensymphony.xwork.interceptor.AroundInterceptor.intercept (AroundInterceptor.java:35)     à l'adresse com.opensymphony.xwork.DefaultActionInvocation.invoke (DefaultActionInvocation.java:164)     à l'adresse com.opensymphony.xwork.DefaultActionProxy.execute (DefaultActionProxy.java:116)     at com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction (ServletDispatcher.java:272)     à l'adresse com.opensymphony.webwork.dispatcher.ServletDispatcher.service (ServletDispatcher.java:237)     sur 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)     sur 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)     à l'adresse 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)     at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt (LeaderFollowerWorkerThread.java:80)     à org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run (ThreadPool.java:684)     at java.lang.Thread.run (Source inconnue)

Était-ce utile?

La solution

Quelle version de Velocity utilisez-vous? Cela était dû à certaines conditions de concurrence dans les anciennes versions. La plupart ont été écrasés dans la version 1.5 de Velocity. Bien que je recommande personnellement d’utiliser Velocity 1.6-beta1. Ses performances (mémoire et vitesse) ont été considérablement améliorées et de nombreuses corrections de bugs mineurs n’ont pas été intégrées à la version 1.5.

Edit: Puisque vous dites que vous utilisez la version 1.4, alors, oui, je suis sûr que c’est la condition de concurrence critique que nous avons fixée. S'il vous plaît envisager de mettre à niveau. 1.6 est définitivement votre meilleur choix, car il corrige votre bug et améliore les performances. 1.6 finale devrait être disponible très bientôt.

Autres conseils

Je travaille sur le même bogue en ce moment, sur notre site Web.

Cela semble être une situation de concurrence critique: je peux le reproduire de manière cohérente à l'aide de plusieurs processus récupérant la même page, mais jamais le reproduire si je sérialise les demandes.

J'utilise velocity-1.5; J'ai essayé de migrer vers la version 1.6-beta1, mais je vois d'autres erreurs.

RÉSOLU : voir les commentaires ci-dessous

Étant donné que les commentaires dans le source indiquent déjà que cela ne devrait pas se produire, je pense que c'est un bogue dans le logiciel Template. Soumettez un rapport de bogue à son auteur.

Vous devez obtenir le suivi complet de la pile de l'exception RuntimeException et de ses causes.

Modifiez votre réponse pour ajouter cette information.

J'ai envoyé un e-mail aux auteurs du code pour savoir s'ils peuvent fournir des informations. Je ferai en sorte de partager tout ce que j'ai appris.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top