From 76ea99ad0b6b40aa9fb5c97a1b773c8c2c72ba15 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Wed, 11 Dec 2013 09:45:31 +0000 Subject: [PATCH] Add instance id suffix to Tomcat Engine name Fixes gh-160 --- .../tomcat/TomcatEmbeddedServletContainer.java | 15 +++++++++++++-- ...omcatEmbeddedServletContainerFactoryTests.java | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java index 5bc3541fc2..1d0b30c324 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java @@ -16,6 +16,9 @@ package org.springframework.boot.context.embedded.tomcat; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.catalina.Engine; import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleState; import org.apache.catalina.connector.Connector; @@ -39,7 +42,7 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer private final Log logger = LogFactory.getLog(TomcatEmbeddedServletContainer.class); - private static int containerCounter = 0; + private static AtomicInteger containerCounter = new AtomicInteger(-1); private final Tomcat tomcat; @@ -66,6 +69,11 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer private synchronized void initialize() throws EmbeddedServletContainerException { try { + int instanceId = containerCounter.incrementAndGet(); + if (instanceId > 0) { + Engine engine = this.tomcat.getEngine(); + engine.setName(engine.getName() + "-" + instanceId); + } this.tomcat.start(); try { // Allow the server to start so the ServletContext is available, but stop @@ -79,7 +87,7 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer } // Unlike Jetty, all Tomcat threads are daemon threads. We create a // blocking non-daemon to stop immediate shutdown - Thread awaitThread = new Thread("container-" + (containerCounter++)) { + Thread awaitThread = new Thread("container-" + (containerCounter.get())) { @Override public void run() { TomcatEmbeddedServletContainer.this.tomcat.getServer().await(); @@ -129,6 +137,9 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer throw new EmbeddedServletContainerException("Unable to stop embedded Tomcat", ex); } + finally { + containerCounter.decrementAndGet(); + } } @Override diff --git a/spring-boot/src/test/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactoryTests.java b/spring-boot/src/test/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactoryTests.java index 984a26a65f..13bca213af 100644 --- a/spring-boot/src/test/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactoryTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactoryTests.java @@ -30,6 +30,7 @@ import org.mockito.InOrder; import org.springframework.boot.context.embedded.AbstractEmbeddedServletContainerFactoryTests; import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyObject; @@ -52,6 +53,20 @@ public class TomcatEmbeddedServletContainerFactoryTests extends return new TomcatEmbeddedServletContainerFactory(); } + // JMX MBean names clash if you get more than one Engine with the same name... + @Test + public void tomcatEngineNames() throws Exception { + TomcatEmbeddedServletContainerFactory factory = getFactory(); + this.container = factory.getEmbeddedServletContainer(); + factory.setPort(8081); + TomcatEmbeddedServletContainer container2 = (TomcatEmbeddedServletContainer) factory + .getEmbeddedServletContainer(); + assertEquals("Tomcat", ((TomcatEmbeddedServletContainer) this.container) + .getTomcat().getEngine().getName()); + assertEquals("Tomcat-1", container2.getTomcat().getEngine().getName()); + container2.stop(); + } + @Test public void tomcatListeners() throws Exception { TomcatEmbeddedServletContainerFactory factory = getFactory();