Frédéric Hannes created TOMEE-4485:
--------------------------------------
Summary: ContextClassLoader becomes null for timer threads in
TomEE 10
Key: TOMEE-4485
URL: https://issues.apache.org/jira/browse/TOMEE-4485
Project: TomEE
Issue Type: Bug
Components: TomEE Core Server
Affects Versions: 10.0.1
Environment: TomEE 10.0.1 running on JRE 21 (Temurin 21.0.6+7) in
Docker container (Ubuntu based). Hibernate 6.6.13 is used instead of OpenJPA.
Reporter: Frédéric Hannes
We've been working on migrating our applications from Java EE to Jakarta EE.
The applications run without any issues on TomEE 8 with Java EE and TomEE 9
with Jakarta EE. But when upgrading to TomEE 10 we notice that errors start
occurring after a few JNDI lookups in a thread from the EjbTimerPool. Since we
don't experience any issues on TomEE 9, I suspect it may be a bug that was
introduced in TomEE 10.
It is still unclear to us what is the underlying cause of the problem and what
component it pertains to, as the exception cause is in code of the Tomcat
server, but the thread is managed by OpenEJB. Since the error occurred when
upgrading to TomEE 10, I've logged it under TomEE, but please move the issue if
needed.
The cause of the exception is a JNDI lookup that fails. In the
{{ContextBindingsisClassLoaderBound()}} method in Tomcat, the context
classloader of the thread is used as the key for a map. At some point the
classloader of these threads in the EjbTimerPool become {{null}} and as a
result we get back this {{NullPointerException}} when it tries to use it as the
key for the map.
{code:java}
application-1 | Caused by: java.lang.NullPointerException: Cannot invoke
"Object.hashCode()" because "<parameter1>" is null
application-1 | at
java.base/java.util.concurrent.ConcurrentHashMap.get(Unknown Source)
application-1 | at
java.base/java.util.concurrent.ConcurrentHashMap.containsKey(Unknown Source)
application-1 | at
org.apache.naming.ContextBindings.isClassLoaderBound(ContextBindings.java:302)
application-1 | at
org.apache.naming.SelectorContext.getBoundContext(SelectorContext.java:390)
application-1 | at
org.apache.naming.SelectorContext.lookup(SelectorContext.java:144)
application-1 | at java.naming/javax.naming.InitialContext.lookup(Unknown
Source)
application-1 | at com.example.c.e.lookupNamedObject(e.java:54)
application-1 | at com.example.a.c.a(c.java:51)
application-1 | ... 23 more
{code}
I've not been able to pinpoint what causes the classloader to be set to
{{null}} and I've not found anything in migration guides, release notes or
commits that have given me much more insight into the issue so far. I am not
familiar enough with the entire codebase of the TomEE ecosystem itself to
efficiently diagnose the issue. But I will update this ticket if I find out
anything more.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)