diff options
Diffstat (limited to 'container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java')
-rw-r--r-- | container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java index 7d84ee6f8a3..1747541bef5 100644 --- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java +++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java @@ -1,15 +1,17 @@ -// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.jdisc.http.server.jetty; import com.google.inject.Inject; import com.yahoo.component.provider.ComponentRegistry; import com.yahoo.container.logging.ConnectionLog; import com.yahoo.container.logging.RequestLog; +import com.yahoo.jdisc.AbstractResource; import com.yahoo.jdisc.Metric; import com.yahoo.jdisc.http.ConnectorConfig; import com.yahoo.jdisc.http.ServerConfig; import com.yahoo.jdisc.service.AbstractServerProvider; import com.yahoo.jdisc.service.CurrentContainer; +import com.yahoo.jdisc.service.ServerProvider; import org.eclipse.jetty.http.HttpField; import org.eclipse.jetty.jmx.ConnectorServer; import org.eclipse.jetty.jmx.MBeanContainer; @@ -36,7 +38,10 @@ import java.net.BindException; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Deque; import java.util.List; +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.function.Supplier; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -45,27 +50,26 @@ import java.util.stream.Collectors; * @author Simon Thoresen Hult * @author bjorncs */ -public class JettyHttpServer extends AbstractServerProvider { +public class JettyHttpServer extends AbstractResource implements ServerProvider { private final static Logger log = Logger.getLogger(JettyHttpServer.class.getName()); + private final ServerConfig config; private final Server server; private final List<Integer> listenedPorts = new ArrayList<>(); private final ServerMetricReporter metricsReporter; + private final Deque<JDiscContext> contexts = new ConcurrentLinkedDeque<>(); @Inject // ServerProvider implementors must use com.google.inject.Inject - public JettyHttpServer(CurrentContainer container, - Metric metric, + public JettyHttpServer(Metric metric, ServerConfig serverConfig, - FilterBindings filterBindings, - Janitor janitor, ComponentRegistry<ConnectorFactory> connectorFactories, RequestLog requestLog, ConnectionLog connectionLog) { - super(container); if (connectorFactories.allComponents().isEmpty()) throw new IllegalArgumentException("No connectors configured."); + this.config = serverConfig; server = new Server(); server.setStopTimeout((long)(serverConfig.stopTimeout() * 1000.0)); server.setRequestLog(new AccessLogRequestLog(requestLog)); @@ -81,9 +85,7 @@ public class JettyHttpServer extends AbstractServerProvider { } server.addBeanToAllConnectors(new ResponseMetricAggregator(serverConfig.metric())); - JDiscContext jDiscContext = new JDiscContext(filterBindings, container, janitor, metric, serverConfig); - - ServletHolder jdiscServlet = new ServletHolder(new JDiscHttpServlet(jDiscContext)); + ServletHolder jdiscServlet = new ServletHolder(new JDiscHttpServlet(this::newestContext)); List<JDiscServerConnector> connectors = Arrays.stream(server.getConnectors()) .map(JDiscServerConnector.class::cast) .toList(); @@ -91,6 +93,22 @@ public class JettyHttpServer extends AbstractServerProvider { this.metricsReporter = new ServerMetricReporter(metric, server); } + JDiscContext registerContext(FilterBindings filterBindings, CurrentContainer container, Janitor janitor, Metric metric) { + JDiscContext context = JDiscContext.of(filterBindings, container, janitor, metric, config); + contexts.addFirst(context); + return context; + } + + void deregisterContext(JDiscContext context) { + contexts.remove(context); + } + + JDiscContext newestContext() { + JDiscContext context = contexts.peekFirst(); + if (context == null) throw new IllegalStateException("JettyHttpServer has no registered JDiscContext"); + return context; + } + private static void setupJmx(Server server, ServerConfig serverConfig) { if (serverConfig.jmx().enabled()) { System.setProperty("java.rmi.server.hostname", "localhost"); |