diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java index 79084d7ff83..31bcd931db8 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java @@ -29,6 +29,7 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.function.Predicate; @@ -136,6 +137,7 @@ public static ContextHandler getContextHandler(Request request) private final MimeTypes.Mutable _mimeTypes = new MimeTypes.Mutable(); private final List _contextListeners = new CopyOnWriteArrayList<>(); private final List _vhosts = new ArrayList<>(); + private final AtomicBoolean _enterScopeSetClassloaderFailed = new AtomicBoolean(); private String _displayName; private String _contextPath = "/"; @@ -754,8 +756,12 @@ protected ClassLoader enterScope(Request contextRequest) } catch (Throwable x) { - if (LOG.isDebugEnabled()) - LOG.debug("error setting a context classloader on thread {}", Thread.currentThread(), x); + // Log as warning the first time it happens. + String msg = "Error setting a context classloader on thread {}"; + if (_enterScopeSetClassloaderFailed.compareAndSet(false, true)) + LOG.warn(msg, Thread.currentThread(), x); + else if (LOG.isDebugEnabled()) + LOG.debug(msg, Thread.currentThread(), x); } } notifyEnterScope(contextRequest); diff --git a/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java b/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java index a7c3ee8a5b7..8301db28539 100644 --- a/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java +++ b/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java @@ -193,7 +193,8 @@ public boolean handle(Request request, Response response, Callback callback) thr @Override public void run() { - try (Blocker.Callback cb = Blocker.callback()) + try (StacklessLogging ignore = new StacklessLogging(ContextHandler.class); + Blocker.Callback cb = Blocker.callback()) { // When a classloader is configured, Response.write() tries to set it as the context classloader. response.write(true, ByteBuffer.allocate(32), cb); @@ -209,6 +210,12 @@ public void run() } } + @Override + public ClassLoader getContextClassLoader() + { + return null; + } + @Override public void setContextClassLoader(ClassLoader cl) { @@ -258,7 +265,8 @@ public boolean handle(Request request, Response response, Callback callback) thr @Override public void completed(Integer result, Object attachment) { - try (Blocker.Callback cb = Blocker.callback()) + try (StacklessLogging ignore = new StacklessLogging(ContextHandler.class); + Blocker.Callback cb = Blocker.callback()) { // When a classloader is configured, Response.write() tries to set it as the context classloader. response.write(true, ByteBuffer.allocate(32), cb);