diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHandler.java index 4953464368c3..6d385f1ace98 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHandler.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHandler.java @@ -43,11 +43,11 @@ import org.eclipse.jetty.http.pathmap.PathSpecSet; import org.eclipse.jetty.server.HttpOutput; import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.HandlerWrapper; import org.eclipse.jetty.util.AsciiLowerCaseSet; import org.eclipse.jetty.util.IncludeExclude; import org.eclipse.jetty.util.StringUtil; -import org.eclipse.jetty.util.compression.CompressionPool; import org.eclipse.jetty.util.compression.DeflaterPool; import org.eclipse.jetty.util.compression.InflaterPool; import org.slf4j.Logger; @@ -163,9 +163,8 @@ public class GzipHandler extends HandlerWrapper implements GzipFactory private static final HttpField TE_CHUNKED = new PreEncodedHttpField(HttpHeader.TRANSFER_ENCODING, HttpHeaderValue.CHUNKED.asString()); private static final Pattern COMMA_GZIP = Pattern.compile(".*, *gzip"); - private final InflaterPool _inflaterPool; - private final DeflaterPool _deflaterPool; - + private InflaterPool _inflaterPool; + private DeflaterPool _deflaterPool; private int _minGzipSize = DEFAULT_MIN_GZIP_SIZE; private boolean _syncFlush = false; private int _inflateBufferSize = -1; @@ -202,11 +201,15 @@ else if (type.startsWith("image/") || if (LOG.isDebugEnabled()) LOG.debug("{} mime types {}", this, _mimeTypes); + } - _deflaterPool = newDeflaterPool(); - _inflaterPool = newInflaterPool(); - addBean(_deflaterPool); - addBean(_inflaterPool); + @Override + protected void doStart() throws Exception + { + Server server = getServer(); + _inflaterPool = InflaterPool.ensurePool(server); + _deflaterPool = DeflaterPool.ensurePool(server); + super.doStart(); } /** @@ -921,16 +924,6 @@ public void setInflaterPoolCapacity(int capacity) _inflaterPool.setCapacity(capacity); } - protected InflaterPool newInflaterPool() - { - return new InflaterPool(CompressionPool.DEFAULT_CAPACITY, true); - } - - protected DeflaterPool newDeflaterPool() - { - return new DeflaterPool(CompressionPool.DEFAULT_CAPACITY, Deflater.DEFAULT_COMPRESSION, true); - } - @Override public String toString() { diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/compression/DeflaterPool.java b/jetty-util/src/main/java/org/eclipse/jetty/util/compression/DeflaterPool.java index ebd3eec2f80e..434de35d938a 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/compression/DeflaterPool.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/compression/DeflaterPool.java @@ -20,6 +20,9 @@ import java.util.zip.Deflater; +import org.eclipse.jetty.util.component.ContainerLifeCycle; +import org.eclipse.jetty.util.thread.ThreadPool; + public class DeflaterPool extends CompressionPool { private final int compressionLevel; @@ -60,4 +63,20 @@ protected void reset(Deflater deflater) { deflater.reset(); } + + public static DeflaterPool ensurePool(ContainerLifeCycle containerLifeCycle) + { + DeflaterPool pool = containerLifeCycle.getBean(DeflaterPool.class); + if (pool != null) + return pool; + + int capacity = CompressionPool.DEFAULT_CAPACITY; + ThreadPool.SizedThreadPool threadPool = containerLifeCycle.getBean(ThreadPool.SizedThreadPool.class); + if (threadPool != null) + capacity = threadPool.getMaxThreads(); + + pool = new DeflaterPool(capacity, Deflater.DEFAULT_COMPRESSION, true); + containerLifeCycle.addBean(pool); + return pool; + } } diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/compression/InflaterPool.java b/jetty-util/src/main/java/org/eclipse/jetty/util/compression/InflaterPool.java index a41e1f933c92..866900a22d61 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/compression/InflaterPool.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/compression/InflaterPool.java @@ -20,6 +20,9 @@ import java.util.zip.Inflater; +import org.eclipse.jetty.util.component.ContainerLifeCycle; +import org.eclipse.jetty.util.thread.ThreadPool; + public class InflaterPool extends CompressionPool { private final boolean nowrap; @@ -57,4 +60,20 @@ protected void reset(Inflater inflater) { inflater.reset(); } + + public static InflaterPool ensurePool(ContainerLifeCycle containerLifeCycle) + { + InflaterPool pool = containerLifeCycle.getBean(InflaterPool.class); + if (pool != null) + return pool; + + int capacity = CompressionPool.DEFAULT_CAPACITY; + ThreadPool.SizedThreadPool threadPool = containerLifeCycle.getBean(ThreadPool.SizedThreadPool.class); + if (threadPool != null) + capacity = threadPool.getMaxThreads(); + + pool = new InflaterPool(capacity, true); + containerLifeCycle.addBean(pool); + return pool; + } } diff --git a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/WebSocketComponents.java b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/WebSocketComponents.java index 5b769e2d1185..26b3e9cbaa80 100644 --- a/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/WebSocketComponents.java +++ b/jetty-websocket/websocket-core-common/src/main/java/org/eclipse/jetty/websocket/core/WebSocketComponents.java @@ -23,6 +23,7 @@ import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.MappedByteBufferPool; import org.eclipse.jetty.util.DecoratedObjectFactory; +import org.eclipse.jetty.util.component.ContainerLifeCycle; import org.eclipse.jetty.util.compression.CompressionPool; import org.eclipse.jetty.util.compression.DeflaterPool; import org.eclipse.jetty.util.compression.InflaterPool; @@ -31,7 +32,7 @@ * A collection of components which are the resources needed for websockets such as * {@link ByteBufferPool}, {@link WebSocketExtensionRegistry}, and {@link DecoratedObjectFactory}. */ -public class WebSocketComponents +public class WebSocketComponents extends ContainerLifeCycle { private final DecoratedObjectFactory objectFactory; private final WebSocketExtensionRegistry extensionRegistry; @@ -41,19 +42,20 @@ public class WebSocketComponents public WebSocketComponents() { - this(new WebSocketExtensionRegistry(), new DecoratedObjectFactory(), new MappedByteBufferPool(), - new InflaterPool(CompressionPool.DEFAULT_CAPACITY, true), - new DeflaterPool(CompressionPool.DEFAULT_CAPACITY, Deflater.DEFAULT_COMPRESSION, true)); + this(null, null, null, null, null); } public WebSocketComponents(WebSocketExtensionRegistry extensionRegistry, DecoratedObjectFactory objectFactory, ByteBufferPool bufferPool, InflaterPool inflaterPool, DeflaterPool deflaterPool) { - this.extensionRegistry = extensionRegistry; - this.objectFactory = objectFactory; - this.bufferPool = bufferPool; - this.deflaterPool = deflaterPool; - this.inflaterPool = inflaterPool; + this.extensionRegistry = (extensionRegistry == null) ? new WebSocketExtensionRegistry() : extensionRegistry; + this.objectFactory = (objectFactory == null) ? new DecoratedObjectFactory() : objectFactory; + this.bufferPool = (bufferPool == null) ? new MappedByteBufferPool() : bufferPool; + this.inflaterPool = (inflaterPool == null) ? new InflaterPool(CompressionPool.DEFAULT_CAPACITY, true) : inflaterPool; + this.deflaterPool = (deflaterPool == null) ? new DeflaterPool(CompressionPool.DEFAULT_CAPACITY, Deflater.DEFAULT_COMPRESSION, true) : deflaterPool; + + addBean(inflaterPool); + addBean(deflaterPool); } public ByteBufferPool getBufferPool() diff --git a/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/WebSocketServerComponents.java b/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/WebSocketServerComponents.java index 2fefc439d092..1bdc76edf061 100644 --- a/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/WebSocketServerComponents.java +++ b/jetty-websocket/websocket-core-server/src/main/java/org/eclipse/jetty/websocket/core/server/WebSocketServerComponents.java @@ -21,7 +21,10 @@ import javax.servlet.ServletContext; import org.eclipse.jetty.io.ByteBufferPool; +import org.eclipse.jetty.server.Server; import org.eclipse.jetty.util.DecoratedObjectFactory; +import org.eclipse.jetty.util.compression.DeflaterPool; +import org.eclipse.jetty.util.compression.InflaterPool; import org.eclipse.jetty.websocket.core.WebSocketComponents; import org.eclipse.jetty.websocket.core.WebSocketExtensionRegistry; @@ -29,23 +32,39 @@ * A collection of components which are the resources needed for websockets such as * {@link ByteBufferPool}, {@link WebSocketExtensionRegistry}, and {@link DecoratedObjectFactory}. * - * These components should be accessed through {@link WebSocketServerComponents#ensureWebSocketComponents} so that + * These components should be accessed through {@link WebSocketServerComponents#getWebSocketComponents} so that * the instance can be shared by being stored as a bean on the ContextHandler. */ public class WebSocketServerComponents extends WebSocketComponents { public static final String WEBSOCKET_COMPONENTS_ATTRIBUTE = WebSocketComponents.class.getName(); - public static WebSocketComponents ensureWebSocketComponents(ServletContext servletContext) + WebSocketServerComponents(InflaterPool inflaterPool, DeflaterPool deflaterPool) { - // Ensure a mapping exists - WebSocketComponents components = (WebSocketComponents)servletContext.getAttribute(WEBSOCKET_COMPONENTS_ATTRIBUTE); + super(null, null, null, inflaterPool, deflaterPool); + } + + public static WebSocketComponents ensureWebSocketComponents(Server server, ServletContext servletContext) + { + WebSocketComponents components = server.getBean(WebSocketComponents.class); if (components == null) { - components = new WebSocketServerComponents(); - servletContext.setAttribute(WEBSOCKET_COMPONENTS_ATTRIBUTE, components); + InflaterPool inflaterPool = InflaterPool.ensurePool(server); + DeflaterPool deflaterPool = DeflaterPool.ensurePool(server); + components = new WebSocketServerComponents(inflaterPool, deflaterPool); + server.addBean(components); } + servletContext.setAttribute(WEBSOCKET_COMPONENTS_ATTRIBUTE, components); + return components; + } + + public static WebSocketComponents getWebSocketComponents(ServletContext servletContext) + { + WebSocketComponents components = (WebSocketComponents)servletContext.getAttribute(WEBSOCKET_COMPONENTS_ATTRIBUTE); + if (components == null) + throw new IllegalStateException("WebSocketComponents has not been created"); + return components; } } diff --git a/jetty-websocket/websocket-javax-server/src/main/java/org/eclipse/jetty/websocket/javax/server/config/JavaxWebSocketServletContainerInitializer.java b/jetty-websocket/websocket-javax-server/src/main/java/org/eclipse/jetty/websocket/javax/server/config/JavaxWebSocketServletContainerInitializer.java index af4cca34fe31..753a454e3b6a 100644 --- a/jetty-websocket/websocket-javax-server/src/main/java/org/eclipse/jetty/websocket/javax/server/config/JavaxWebSocketServletContainerInitializer.java +++ b/jetty-websocket/websocket-javax-server/src/main/java/org/eclipse/jetty/websocket/javax/server/config/JavaxWebSocketServletContainerInitializer.java @@ -148,7 +148,7 @@ private static ServerContainer initialize(ServletContextHandler context) JavaxWebSocketServerContainer serverContainer = JavaxWebSocketServerContainer.getContainer(context.getServletContext()); if (serverContainer == null) { - WebSocketComponents components = WebSocketServerComponents.ensureWebSocketComponents(context.getServletContext()); + WebSocketComponents components = WebSocketServerComponents.ensureWebSocketComponents(context.getServer(), context.getServletContext()); FilterHolder filterHolder = WebSocketUpgradeFilter.ensureFilter(context.getServletContext()); WebSocketMapping mapping = WebSocketMapping.ensureMapping(context.getServletContext(), WebSocketMapping.DEFAULT_KEY); serverContainer = JavaxWebSocketServerContainer.ensureContainer(context.getServletContext()); diff --git a/jetty-websocket/websocket-javax-server/src/main/java/org/eclipse/jetty/websocket/javax/server/internal/JavaxWebSocketServerContainer.java b/jetty-websocket/websocket-javax-server/src/main/java/org/eclipse/jetty/websocket/javax/server/internal/JavaxWebSocketServerContainer.java index f3561078a6ec..f9218c819d95 100644 --- a/jetty-websocket/websocket-javax-server/src/main/java/org/eclipse/jetty/websocket/javax/server/internal/JavaxWebSocketServerContainer.java +++ b/jetty-websocket/websocket-javax-server/src/main/java/org/eclipse/jetty/websocket/javax/server/internal/JavaxWebSocketServerContainer.java @@ -99,7 +99,7 @@ public static JavaxWebSocketServerContainer ensureContainer(ServletContext servl // Create the Jetty ServerContainer implementation container = new JavaxWebSocketServerContainer( WebSocketMapping.ensureMapping(servletContext, WebSocketMapping.DEFAULT_KEY), - WebSocketServerComponents.ensureWebSocketComponents(servletContext), + WebSocketServerComponents.getWebSocketComponents(servletContext), coreClientSupplier); contextHandler.addManaged(container); contextHandler.addEventListener(container); diff --git a/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/JettyWebSocketServerContainer.java b/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/JettyWebSocketServerContainer.java index 52c2d6b2f68c..759e773bbd19 100644 --- a/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/JettyWebSocketServerContainer.java +++ b/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/JettyWebSocketServerContainer.java @@ -78,7 +78,7 @@ public static JettyWebSocketServerContainer ensureContainer(ServletContext servl container = new JettyWebSocketServerContainer( contextHandler, WebSocketMapping.ensureMapping(servletContext, WebSocketMapping.DEFAULT_KEY), - WebSocketServerComponents.ensureWebSocketComponents(servletContext), executor); + WebSocketServerComponents.getWebSocketComponents(servletContext), executor); servletContext.setAttribute(JETTY_WEBSOCKET_CONTAINER_ATTRIBUTE, container); contextHandler.addManaged(container); contextHandler.addEventListener(container); diff --git a/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/JettyWebSocketServlet.java b/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/JettyWebSocketServlet.java index 0cbdd6b12127..eb5f4016c5ec 100644 --- a/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/JettyWebSocketServlet.java +++ b/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/JettyWebSocketServlet.java @@ -132,7 +132,7 @@ public void init() throws ServletException { ServletContext servletContext = getServletContext(); - components = WebSocketServerComponents.ensureWebSocketComponents(servletContext); + components = WebSocketServerComponents.getWebSocketComponents(servletContext); mapping = new WebSocketMapping(components); String max = getInitParameter("idleTimeout"); diff --git a/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/config/JettyWebSocketServletContainerInitializer.java b/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/config/JettyWebSocketServletContainerInitializer.java index 4740fbc75f88..6b829fd461fa 100644 --- a/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/config/JettyWebSocketServletContainerInitializer.java +++ b/jetty-websocket/websocket-jetty-server/src/main/java/org/eclipse/jetty/websocket/server/config/JettyWebSocketServletContainerInitializer.java @@ -88,7 +88,7 @@ public static void configure(ServletContextHandler context, Configurator configu */ private static JettyWebSocketServerContainer initialize(ServletContextHandler context) { - WebSocketComponents components = WebSocketServerComponents.ensureWebSocketComponents(context.getServletContext()); + WebSocketComponents components = WebSocketServerComponents.ensureWebSocketComponents(context.getServer(), context.getServletContext()); WebSocketMapping mapping = WebSocketMapping.ensureMapping(context.getServletContext(), WebSocketMapping.DEFAULT_KEY); JettyWebSocketServerContainer container = JettyWebSocketServerContainer.ensureContainer(context.getServletContext()); diff --git a/jetty-websocket/websocket-jetty-tests/src/test/java/org/eclipse/jetty/websocket/tests/MaxOutgoingFramesTest.java b/jetty-websocket/websocket-jetty-tests/src/test/java/org/eclipse/jetty/websocket/tests/MaxOutgoingFramesTest.java index 55cf722ca153..a9bac43cdcd5 100644 --- a/jetty-websocket/websocket-jetty-tests/src/test/java/org/eclipse/jetty/websocket/tests/MaxOutgoingFramesTest.java +++ b/jetty-websocket/websocket-jetty-tests/src/test/java/org/eclipse/jetty/websocket/tests/MaxOutgoingFramesTest.java @@ -73,7 +73,7 @@ public void start() throws Exception JettyWebSocketServletContainerInitializer.configure(contextHandler, (context, container) -> { container.addMapping("/", (req, resp) -> serverSocket); - WebSocketComponents components = WebSocketServerComponents.ensureWebSocketComponents(context); + WebSocketComponents components = WebSocketServerComponents.getWebSocketComponents(context); components.getExtensionRegistry().register(BlockingOutgoingExtension.class.getName(), BlockingOutgoingExtension.class); }); diff --git a/jetty-websocket/websocket-util-server/src/main/java/org/eclipse/jetty/websocket/util/server/WebSocketUpgradeFilter.java b/jetty-websocket/websocket-util-server/src/main/java/org/eclipse/jetty/websocket/util/server/WebSocketUpgradeFilter.java index d756b0bcc182..d3cf9e1391b6 100644 --- a/jetty-websocket/websocket-util-server/src/main/java/org/eclipse/jetty/websocket/util/server/WebSocketUpgradeFilter.java +++ b/jetty-websocket/websocket-util-server/src/main/java/org/eclipse/jetty/websocket/util/server/WebSocketUpgradeFilter.java @@ -177,7 +177,7 @@ public void init(FilterConfig config) throws ServletException if (mappingKey != null) mapping = WebSocketMapping.ensureMapping(context, mappingKey); else - mapping = new WebSocketMapping(WebSocketServerComponents.ensureWebSocketComponents(context)); + mapping = new WebSocketMapping(WebSocketServerComponents.getWebSocketComponents(context)); String max = config.getInitParameter("idleTimeout"); if (max == null) diff --git a/jetty-websocket/websocket-util-server/src/main/java/org/eclipse/jetty/websocket/util/server/internal/WebSocketMapping.java b/jetty-websocket/websocket-util-server/src/main/java/org/eclipse/jetty/websocket/util/server/internal/WebSocketMapping.java index 49283dbf8e1d..5bef84d466f7 100644 --- a/jetty-websocket/websocket-util-server/src/main/java/org/eclipse/jetty/websocket/util/server/internal/WebSocketMapping.java +++ b/jetty-websocket/websocket-util-server/src/main/java/org/eclipse/jetty/websocket/util/server/internal/WebSocketMapping.java @@ -89,7 +89,7 @@ public static WebSocketMapping ensureMapping(ServletContext servletContext, Stri if (mapping == null) { - mapping = new WebSocketMapping(WebSocketServerComponents.ensureWebSocketComponents(servletContext)); + mapping = new WebSocketMapping(WebSocketServerComponents.getWebSocketComponents(servletContext)); servletContext.setAttribute(mappingKey, mapping); }