[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[jetty-users] Bad __context set in WebAppContext.start sequence with respect to ENC setup
|
We are embedding Jetty and today we noticed the following not quite
trivial bug in Jetty's start handling for Web apps.
This bug was observed on Jetty 8.1.4 and as far as I can tell the
relevant code has not changed since then. It happens when you start a
WebAppContext from within a running Web app, i.e. while processing a
request. In our scenario, a Web app may be started on-demand and the
trigger to do so may occur while in a Web app.
I checked with Jetty 6.1.22 (old integration) and it works ok there - I
did not debug it all the way through to see why it works there and not
in 8.1.4.
Here is what happens:
When calling WebAppContext.start() you end up in WebAppContext.doStart()
which has this control flow:
preConfigure();
super.doStart();
postConfigure();
In preConfigure, eventually EnvConfiguration.preConfigure(<context>) is
called and that is setting up the JNDI ENC.
And here is where ContextFactory comes into the game:
When looking for the class loader to identify a "java:comp" ENC from,
ContextFactory.getObjectInstance first consults
ContextHandler.getCurrentContext(). Only if that returns null, the
current thread's context class loader is considered.
However, the switch of Jetty Contexts in ContextHandler is done in
ContextHandler.doStart(), i.e. only after the call to preConfigure() in
WebAppContext.doStart().
Now, if you are not in a Web App and you want to start a WebAppContext
and the current thread's context classloader is set, then
ContextHandler.getCurrentContext()==null and you get an ENC for the new
Web App as expected.
But if you are currently processing a Web app request, then
ContextHandler.doScope will have set that Web app's context and
ContextHandler.getCurrentContext()!=null and ContextFactory will try to
create an ENC for a loader that already has one and you get:
Caused by: javax.naming.NamingException: This context is immutable;
remaining name 'env'
at
org.eclipse.jetty.jndi.NamingContext.createSubcontext(NamingContext.java:302)
at
org.eclipse.jetty.jndi.NamingContext.createSubcontext(NamingContext.java:383)
at
org.eclipse.jetty.plus.webapp.EnvConfiguration.createEnvContext(EnvConfiguration.java:253)
at
org.eclipse.jetty.plus.webapp.EnvConfiguration.preConfigure(EnvConfiguration.java:67)
at
org.eclipse.jetty.webapp.WebAppContext.preConfigure(WebAppContext.java:430)
at
org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:466)
at
org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
Please let me know, if there is some way of getting around this. Hope
there was sufficient details and sorry for the complex case.
Thanks,
Henning