From 4b2ae049adee7c068fe22f63ebd2dd44eeaae92d Mon Sep 17 00:00:00 2001 From: Alexander Zobkov Date: Wed, 30 Jul 2014 20:22:23 +0400 Subject: [PATCH] Allow to configure the thread name prefix for threads that are used by the Jetty instance for processing requests --- .../http_jetty/JettyHTTPServerEngine.java | 7 +++ .../JettyHTTPServerEngineFactory.java | 3 +- .../http_jetty/ThreadingParameters.java | 16 +++++ .../JettyHTTPServerEngineFactoryHolder.java | 1 + .../osgi/HTTPJettyTransportActivator.java | 2 + ...yHTTPServerEngineBeanDefinitionParser.java | 3 + .../spring/JettySpringTypesFactory.java | 1 + .../schemas/configuration/http-jetty.xsd | 5 ++ .../http_jetty/JettyHTTPServerEngineTest.java | 61 ++++++++++++++++++- .../spring/ApplicationContextTest.java | 6 +- .../http_jetty/spring/bean.properties | 1 + .../http_jetty/spring/beans-props.xml | 4 +- .../cxf/transport/http_jetty/spring/beans.xml | 4 +- 13 files changed, 107 insertions(+), 7 deletions(-) diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java index c490c7cb3d5..6a732157776 100644 --- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java +++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java @@ -508,6 +508,9 @@ && getThreadingParameters().getMaxThreads() <= acc) { if (getThreadingParameters().isSetMaxThreads()) { pl.setMaxThreads(getThreadingParameters().getMaxThreads()); } + if (getThreadingParameters().isThreadNamePrefixSet()) { + pl.setName(getThreadingParameters().getThreadNamePrefix()); + } } else { try { if (getThreadingParameters().isSetMinThreads()) { @@ -518,6 +521,10 @@ && getThreadingParameters().getMaxThreads() <= acc) { pool.getClass().getMethod("setMaxThreads", Integer.TYPE) .invoke(pool, getThreadingParameters().getMaxThreads()); } + if (getThreadingParameters().isThreadNamePrefixSet()) { + pool.getClass().getMethod("setName", String.class) + .invoke(pool, getThreadingParameters().getThreadNamePrefix()); + } } catch (Throwable t) { //ignore - this won't happen for Jetty 7.1 - 7.2 and 7.3 and newer //will be instanceof QueuedThreadPool above diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineFactory.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineFactory.java index 85b128ed733..23bfafba208 100644 --- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineFactory.java +++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineFactory.java @@ -278,9 +278,10 @@ public synchronized JettyHTTPServerEngine createJettyHTTPServerEngine(String hos if (LOG.isLoggable(Level.INFO)) { final int min = fallbackThreadingParameters.getMinThreads(); final int max = fallbackThreadingParameters.getMaxThreads(); + final String threadNamePrefix = fallbackThreadingParameters.getThreadNamePrefix(); LOG.log(Level.INFO, "FALLBACK_THREADING_PARAMETERS_MSG", - new Object[] {port, min, max}); + new Object[] {port, min, max, threadNamePrefix}); } ref.setThreadingParameters(fallbackThreadingParameters); } diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/ThreadingParameters.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/ThreadingParameters.java index 511874b6415..7c3ca518767 100644 --- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/ThreadingParameters.java +++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/ThreadingParameters.java @@ -26,8 +26,10 @@ public class ThreadingParameters { private int minThreads; private int maxThreads; + private String threadNamePrefix; private boolean minThreadsSet; private boolean maxThreadsSet; + private boolean threadNamePrefixSet; public void setMinThreads(int number) { minThreadsSet = true; @@ -38,6 +40,15 @@ public void setMaxThreads(int number) { maxThreadsSet = true; maxThreads = number; } + + public String getThreadNamePrefix() { + return threadNamePrefix; + } + + public void setThreadNamePrefix(String threadNamePrefix) { + threadNamePrefixSet = true; + this.threadNamePrefix = threadNamePrefix; + } public int getMinThreads() { return minThreads; @@ -54,4 +65,9 @@ public boolean isSetMaxThreads() { public boolean isSetMinThreads() { return minThreadsSet; } + + public boolean isThreadNamePrefixSet() { + return threadNamePrefixSet; + } + } diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/blueprint/JettyHTTPServerEngineFactoryHolder.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/blueprint/JettyHTTPServerEngineFactoryHolder.java index a4dd16083ce..ace5b41a926 100644 --- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/blueprint/JettyHTTPServerEngineFactoryHolder.java +++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/blueprint/JettyHTTPServerEngineFactoryHolder.java @@ -93,6 +93,7 @@ public void init() { String id = threads.getId(); rThreads.setMaxThreads(threads.getThreadingParameters().getMaxThreads()); rThreads.setMinThreads(threads.getThreadingParameters().getMinThreads()); + rThreads.setThreadNamePrefix(threads.getThreadingParameters().getThreadNamePrefix()); threadingParametersMap.put(id, rThreads); } diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/osgi/HTTPJettyTransportActivator.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/osgi/HTTPJettyTransportActivator.java index 6feaec2e3e8..5160e53cdd7 100644 --- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/osgi/HTTPJettyTransportActivator.java +++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/osgi/HTTPJettyTransportActivator.java @@ -163,6 +163,8 @@ private ThreadingParameters createThreadingParameters(Dictionary p.setMinThreads(Integer.parseInt(v)); } else if ("maxThreads".equals(k)) { p.setMaxThreads(Integer.parseInt(v)); + } else if ("threadNamePrefix".equals(k)) { + p.setThreadNamePrefix(k); } } } diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/spring/JettyHTTPServerEngineBeanDefinitionParser.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/spring/JettyHTTPServerEngineBeanDefinitionParser.java index 97f66e3e0e1..a17e5bbbb32 100644 --- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/spring/JettyHTTPServerEngineBeanDefinitionParser.java +++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/spring/JettyHTTPServerEngineBeanDefinitionParser.java @@ -226,6 +226,9 @@ private static ThreadingParameters toThreadingParameters( if (paramtype.getMinThreads() != null) { params.setMinThreads(paramtype.getMinThreads()); } + if (paramtype.getThreadNamePrefix() != null) { + params.setThreadNamePrefix(paramtype.getThreadNamePrefix()); + } return params; } diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/spring/JettySpringTypesFactory.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/spring/JettySpringTypesFactory.java index 9cb14783e8a..2a1fda6b0d7 100644 --- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/spring/JettySpringTypesFactory.java +++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/spring/JettySpringTypesFactory.java @@ -62,6 +62,7 @@ private static ThreadingParameters toThreadingParameters(ThreadingParametersType ThreadingParameters params = new ThreadingParameters(); params.setMaxThreads(paramtype.getMaxThreads()); params.setMinThreads(paramtype.getMinThreads()); + params.setThreadNamePrefix(paramtype.getThreadNamePrefix()); return params; } diff --git a/rt/transports/http-jetty/src/main/resources/schemas/configuration/http-jetty.xsd b/rt/transports/http-jetty/src/main/resources/schemas/configuration/http-jetty.xsd index ce1e5c54246..f444bdc3eb6 100644 --- a/rt/transports/http-jetty/src/main/resources/schemas/configuration/http-jetty.xsd +++ b/rt/transports/http-jetty/src/main/resources/schemas/configuration/http-jetty.xsd @@ -52,6 +52,11 @@ Specifies the maximum number of threads available to the Jetty instance for processing requests. + + + Specifies the thread name prefix for threads that are used by the Jetty instance for processing requests. + + diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineTest.java b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineTest.java index bcf67351be7..5dda1886d3e 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineTest.java +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngineTest.java @@ -29,6 +29,7 @@ import java.net.URLConnection; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Set; import javax.management.ObjectName; @@ -49,7 +50,8 @@ import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.eclipse.jetty.server.ssl.SslSocketConnector; - +import org.eclipse.jetty.util.thread.QueuedThreadPool; +import org.eclipse.jetty.util.thread.ThreadPool; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -89,7 +91,64 @@ public void setUp() throws Exception { factory.setBus(bus); } + + /** + * Check that names of threads serving requests for instances of JettyHTTPServerEngine + * can be set with user specified name. + */ + @Test + public void testSettingThreadNames() throws Exception { + // User specific thread name prefix 1 + String threadNamePrefix1 = "TestPrefix"; + JettyHTTPServerEngine engine = factory.createJettyHTTPServerEngine(PORT1, "http"); + ThreadingParameters parameters = new ThreadingParameters(); + parameters.setThreadNamePrefix(threadNamePrefix1); + engine.setThreadingParameters(parameters); + engine.finalizeConfig(); + JettyHTTPTestHandler handler = new JettyHTTPTestHandler("string1", true); + engine.addServant(new URL("https://localhost:" + PORT1 + "/test"), handler); + assertTrue("No threads whose name is started with " + threadNamePrefix1, + checkForExistenceOfThreads(threadNamePrefix1)); + + // Default thread name prefix + engine = factory.createJettyHTTPServerEngine(PORT3, "http"); + engine.finalizeConfig(); + handler = new JettyHTTPTestHandler("string3", true); + engine.addServant(new URL("https://localhost:" + PORT3 + "/test"), handler); + ThreadPool threadPool = engine.getServer().getThreadPool(); + QueuedThreadPool qtp = (QueuedThreadPool)threadPool; + String prefixDefault = qtp.getName(); + assertTrue("No threads whose name is started with " + prefixDefault, + checkForExistenceOfThreads(prefixDefault)); + + // User specific thread name prefix 2 + String threadNamePrefix2 = "AnotherPrefix"; + engine = factory.createJettyHTTPServerEngine(PORT2, "http"); + parameters = new ThreadingParameters(); + parameters.setThreadNamePrefix(threadNamePrefix2); + engine.setThreadingParameters(parameters); + engine.finalizeConfig(); + handler = new JettyHTTPTestHandler("string2", true); + engine.addServant(new URL("https://localhost:" + PORT2 + "/test"), handler); + assertTrue("No threads whose name is started with " + threadNamePrefix2, + checkForExistenceOfThreads(threadNamePrefix2)); + + JettyHTTPServerEngineFactory.destroyForPort(PORT1); + JettyHTTPServerEngineFactory.destroyForPort(PORT2); + JettyHTTPServerEngineFactory.destroyForPort(PORT3); + } + private boolean checkForExistenceOfThreads(String prefixName) { + Map threads = Thread.getAllStackTraces(); + Set threadSet = threads.keySet(); + for (Thread thread : threadSet) { + if (thread.getName().startsWith(prefixName)) { + return true; + } + } + return false; + } + @Test public void testEngineRetrieval() throws Exception { JettyHTTPServerEngine engine = diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/ApplicationContextTest.java b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/ApplicationContextTest.java index 7b382885795..753dbcff9ae 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/ApplicationContextTest.java +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/ApplicationContextTest.java @@ -116,6 +116,7 @@ private void checkContext(TestApplicationContext ctx) throws Exception { JettyHTTPServerEngine engine = (JettyHTTPServerEngine)jd.getEngine(); assertEquals(111, engine.getThreadingParameters().getMinThreads()); assertEquals(120, engine.getThreadingParameters().getMaxThreads()); + assertEquals("TestPrefix", engine.getThreadingParameters().getThreadNamePrefix()); ConduitInitiatorManager cim = bus.getExtension(ConduitInitiatorManager.class); ConduitInitiator ci = cim.getConduitInitiator("http://cxf.apache.org/transports/http"); @@ -135,6 +136,8 @@ private void checkContext(TestApplicationContext ctx) throws Exception { assertFalse(engine.getSendServerVersion()); assertEquals(99, engine.getThreadingParameters().getMinThreads()); assertEquals(777, engine.getThreadingParameters().getMaxThreads()); + assertEquals("AnotherPrefix", engine.getThreadingParameters().getThreadNamePrefix()); + assertTrue("The engine should support session manager", engine.isSessionSupport()); assertNotNull("The handlers should not be null", engine.getHandlers()); assertEquals(1, engine.getHandlers().size()); @@ -148,6 +151,7 @@ private void checkContext(TestApplicationContext ctx) throws Exception { engine = (JettyHTTPServerEngine)jd3.getEngine(); assertEquals(111, engine.getThreadingParameters().getMinThreads()); assertEquals(120, engine.getThreadingParameters().getMaxThreads()); + assertEquals("TestPrefix", engine.getThreadingParameters().getThreadNamePrefix()); assertEquals(engine.getTlsServerParameters().getClientAuthentication().isWant(), true); assertEquals(engine.getTlsServerParameters().getClientAuthentication().isRequired(), true); @@ -180,6 +184,6 @@ private EndpointInfo getEndpointInfo(String serviceNS, info2.setAddress(address); return info2; } - + } diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/bean.properties b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/bean.properties index e96685d62d7..54f20007e7e 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/bean.properties +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/bean.properties @@ -26,5 +26,6 @@ engine.port.zero.minThreads=21 engine.port.zero.maxThreads=389 engine.port.nine.one.minThreads=99 engine.port.nine.one.maxThreads=777 +engine.port.nine.one.threadNamePrefix=AnotherPrefix engine.port.nine.one.maxIdle=40000 engine.port.nine.one.sendServerVersion=false diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans-props.xml b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans-props.xml index ea3aaa801c4..a8b8365baaa 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans-props.xml +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans-props.xml @@ -47,7 +47,7 @@ - + @@ -56,7 +56,7 @@ - + diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans.xml b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans.xml index e52d93a7bb6..0561360ad6f 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans.xml +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans.xml @@ -34,7 +34,7 @@ - + @@ -43,7 +43,7 @@ - +