[jira] [Resolved] (VELOCITY-992) VelocityEngine multi-thread deadlock
"Claude Brisson (Jira)" <[email protected]> Wed, 22 Apr 2026 17:37:00 +0000 (UTC)
| Newsgroups | gmane.comp.jakarta.velocity.devel |
|---|---|
| Message-ID | <[email protected]> |
[ https://issues.apache.org/jira/browse/VELOCITY-992?page=3Dcom.atlass=
ian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Claude Brisson resolved VELOCITY-992.
-------------------------------------
Assignee: Claude Brisson
Resolution: Cannot Reproduce
> VelocityEngine multi-thread deadlock
> ------------------------------------
>
> Key: VELOCITY-992
> URL: https://issues.apache.org/jira/browse/VELOCITY-992
> Project: Velocity
> Issue Type: Bug
> Components: Engine
> Affects Versions: 2.4.1
> Reporter: vincent royer
> Assignee: Claude Brisson
> Priority: Major
>
> When using one VelocityEngine instance in a multithread app, I get the fo=
llowing dead lock:
> "{*}javamail-executor-thread-1{*}@20270" tid=3D0xe0 nid=3DNA waiting for =
monitor entry
> =C2=A0 java.lang.Thread.State: BLOCKED
> =C2=A0 =C2=A0 =C2=A0waiting for {*}javamail-executor-thread-2{*}@20366 to=
release lock on <0x5094> (a int[])
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.directive.RuntimeMacr=
o.init(RuntimeMacro.java:133)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.parser.node.ASTDirect=
ive.init(ASTDirective.java:197)
> =C2=A0 =C2=A0 =C2=A0 - locked <0x5093> (a org.apache.velocity.runtime.par=
ser.node.ASTDirective)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.parser.node.SimpleNod=
e.init(SimpleNode.java:400)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.parser.node.ASTproces=
s.init(ASTprocess.java:64)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.Template.initDocument(Templat=
e.java:230)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.Template.process(Template.jav=
a:146)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.resource.ResourceMana=
gerImpl.loadResource(ResourceManagerImpl.java:429)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.resource.ResourceMana=
gerImpl.getResource(ResourceManagerImpl.java:346)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.RuntimeInstance.getTe=
mplate(RuntimeInstance.java:1696)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.directive.Parse.getTe=
mplate(Parse.java:356)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.directive.Parse.rende=
r(Parse.java:220)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.parser.node.ASTDirect=
ive.render(ASTDirective.java:304)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.parser.node.SimpleNod=
e.render(SimpleNode.java:439)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.Template.merge(Template.java:=
358)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.Template.merge(Template.java:=
262)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.app.VelocityEngine.mergeTempl=
ate(VelocityEngine.java:295)
> =C2=A0 =C2=A0 =C2=A0 at io.micronaut.views.velocity.VelocityViewsRenderer=
.render(VelocityViewsRenderer.java:92)
> "{*}javamail-executor-thread-2{*}@20366" tid=3D0xe2 nid=3DNA runnable
> =C2=A0 java.lang.Thread.State: RUNNABLE
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.directive.RuntimeMacr=
o.init(RuntimeMacro.java:133)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.parser.node.ASTDirect=
ive.init(ASTDirective.java:197)
> =C2=A0 =C2=A0 =C2=A0 - locked <{*}0x5095{*}> (a org.apache.velocity.runti=
me.parser.node.ASTDirective)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.parser.node.SimpleNod=
e.init(SimpleNode.java:400)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.parser.node.ASTproces=
s.init(ASTprocess.java:64)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.Template.initDocument(Templat=
e.java:230)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.Template.process(Template.jav=
a:146)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.resource.ResourceMana=
gerImpl.loadResource(ResourceManagerImpl.java:429)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.resource.ResourceMana=
gerImpl.getResource(ResourceManagerImpl.java:346)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.RuntimeInstance.getTe=
mplate(RuntimeInstance.java:1696)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.directive.Parse.getTe=
mplate(Parse.java:356)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.directive.Parse.rende=
r(Parse.java:220)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.parser.node.ASTDirect=
ive.render(ASTDirective.java:304)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.runtime.parser.node.SimpleNod=
e.render(SimpleNode.java:439)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.Template.merge(Template.java:=
358)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.Template.merge(Template.java:=
262)
> =C2=A0 =C2=A0 =C2=A0 at org.apache.velocity.app.VelocityEngine.mergeTempl=
ate(VelocityEngine.java:295)
> =C2=A0 =C2=A0 =C2=A0 at io.micronaut.views.velocity.VelocityViewsRenderer=
.render(VelocityViewsRenderer.java:92)
> =C2=A0
> This is probably because the reentrant Node.init() is synchronized in the=
ASTDirective.
> {color:#b3ae60}@Override {color}{color:#cf8e6d}public synchronized {color=
}Object {color:#56a8f5}init{color}(InternalContextAdapter context, Object d=
ata) {color:#cf8e6d}throws {color}TemplateInitException
> See [https://github.com/apache/velocity-engine/blob/master/velocity-engin=
e-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTDirective.j=
ava#L101]
> My velocity template defines a runtime macro for i18n, processed as an AS=
TDirective, and the content of the macro is also processed as an ASTDirecti=
ve, causing the reentrant deadlock.
> #macro(msg $key) $messages.getMessage($key, $key, $locale) #end
> #parse("templates/header.vm")
--
This message was sent by Atlassian Jira
(v8.20.10#820010)