This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
The following commit(s) were added to refs/heads/main by this push:
new bba832139c ARTEMIS-4514 make Jetty thread pool configurable
bba832139c is described below
commit bba832139cb5e02f9cf716d24cf6cde867b94ed6
Author: Justin Bertram <[email protected]>
AuthorDate: Tue Nov 28 12:52:30 2023 -0600
ARTEMIS-4514 make Jetty thread pool configurable
---
.../apache/activemq/artemis/dto/WebServerDTO.java | 33 ++++++++++++++++++++++
.../artemis/component/WebServerComponent.java | 7 ++++-
.../activemq/cli/test/WebServerComponentTest.java | 23 +++++++++++++++
docs/user-manual/web-server.adoc | 8 ++++++
4 files changed, 70 insertions(+), 1 deletion(-)
diff --git
a/artemis-dto/src/main/java/org/apache/activemq/artemis/dto/WebServerDTO.java
b/artemis-dto/src/main/java/org/apache/activemq/artemis/dto/WebServerDTO.java
index b6360113dd..94dd61b954 100644
---
a/artemis-dto/src/main/java/org/apache/activemq/artemis/dto/WebServerDTO.java
+++
b/artemis-dto/src/main/java/org/apache/activemq/artemis/dto/WebServerDTO.java
@@ -95,6 +95,15 @@ public class WebServerDTO extends ComponentDTO {
@XmlAttribute
public Boolean webContentEnabled;
+ @XmlAttribute
+ public Integer maxThreads = 200;
+
+ @XmlAttribute
+ public Integer minThreads = Math.min(8, maxThreads);
+
+ @XmlAttribute
+ public Integer idleThreadTimeout = 60000;
+
public String getPath() {
return path;
}
@@ -135,6 +144,30 @@ public class WebServerDTO extends ComponentDTO {
this.webContentEnabled = webContentEnabled;
}
+ public Integer getMaxThreads() {
+ return maxThreads;
+ }
+
+ public void setMaxThreads(Integer maxThreads) {
+ this.maxThreads = maxThreads;
+ }
+
+ public Integer getMinThreads() {
+ return minThreads;
+ }
+
+ public void setMinThreads(Integer minThreads) {
+ this.minThreads = minThreads;
+ }
+
+ public Integer getIdleThreadTimeout() {
+ return idleThreadTimeout;
+ }
+
+ public void setIdleThreadTimeout(Integer idleThreadTimeout) {
+ this.idleThreadTimeout = idleThreadTimeout;
+ }
+
public List<BindingDTO> getBindings() {
return bindings;
}
diff --git
a/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
b/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
index f1d1300d03..1d6d9b7bb3 100644
---
a/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
+++
b/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
@@ -52,6 +52,7 @@ import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -99,7 +100,7 @@ public class WebServerComponent implements
ExternalComponent, WebServerComponent
}
ActiveMQWebLogger.LOGGER.startingEmbeddedWebServer();
- server = new Server();
+ server = new Server(new QueuedThreadPool(webServerConfig.maxThreads,
webServerConfig.minThreads, webServerConfig.idleThreadTimeout));
handlers = new HandlerList();
HttpConfiguration httpConfiguration = new HttpConfiguration();
@@ -411,4 +412,8 @@ public class WebServerComponent implements
ExternalComponent, WebServerComponent
public List<Pair<WebAppContext, String>> getWebContextData() {
return this.webContextData;
}
+
+ public Server getWebServer() {
+ return server;
+ }
}
diff --git
a/artemis-web/src/test/java/org/apache/activemq/cli/test/WebServerComponentTest.java
b/artemis-web/src/test/java/org/apache/activemq/cli/test/WebServerComponentTest.java
index bdd7e7dd56..89703333d7 100644
---
a/artemis-web/src/test/java/org/apache/activemq/cli/test/WebServerComponentTest.java
+++
b/artemis-web/src/test/java/org/apache/activemq/cli/test/WebServerComponentTest.java
@@ -89,6 +89,7 @@ import org.apache.http.impl.conn.DefaultRoutePlanner;
import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContextBuilder;
import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.util.thread.ThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import org.eclipse.jetty.webapp.WebInfConfiguration;
import org.junit.After;
@@ -179,6 +180,28 @@ public class WebServerComponentTest extends Assert {
Assert.assertFalse(webServerComponent.isStarted());
}
+ @Test
+ public void testThreadPool() throws Exception {
+ BindingDTO bindingDTO = new BindingDTO();
+ bindingDTO.uri = "http://localhost:0";
+ WebServerDTO webServerDTO = new WebServerDTO();
+ webServerDTO.setBindings(Collections.singletonList(bindingDTO));
+ webServerDTO.path = "webapps";
+ webServerDTO.webContentEnabled = true;
+ webServerDTO.maxThreads = 75;
+ webServerDTO.minThreads = 50;
+ WebServerComponent webServerComponent = new WebServerComponent();
+ Assert.assertFalse(webServerComponent.isStarted());
+ webServerComponent.configure(webServerDTO, "./src/test/resources/",
"./src/test/resources/");
+ testedComponents.add(webServerComponent);
+ webServerComponent.start();
+ ThreadPool.SizedThreadPool jettyPool = (ThreadPool.SizedThreadPool)
webServerComponent.getWebServer().getThreadPool();
+ assertEquals((long) webServerDTO.minThreads, jettyPool.getMinThreads());
+ assertEquals((long) webServerDTO.maxThreads, jettyPool.getMaxThreads());
+ webServerComponent.stop(true);
+ Assert.assertFalse(webServerComponent.isStarted());
+ }
+
@Test
public void testComponentStopBehavior() throws Exception {
BindingDTO bindingDTO = new BindingDTO();
diff --git a/docs/user-manual/web-server.adoc b/docs/user-manual/web-server.adoc
index 05a9bc4623..f25e1fdcaa 100644
--- a/docs/user-manual/web-server.adoc
+++ b/docs/user-manual/web-server.adoc
@@ -35,6 +35,14 @@ The location to redirect the requests with the root target.
webContentEnabled::
Whether or not the content included in the web folder of the home and the
instance directories is accessible.
Default is `false`.
+maxThreads::
+The maximum number of threads the embedded web server can create to service
HTTP requests.
+Default is `200`.
+minThreads::
+The minimum number of threads the embedded web server will hold to service
HTTP requests.
+Default is `8` or the value of `maxThreads` if it is lower.
+idleThreadTimeout::
+The time to wait before terminating an idle thread from the embedded web
server. Measured in milliseconds. Default is `60000`.
=== Binding