[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)