From c92a941489dd0f4ed63cdd510675a8f668b00397 Mon Sep 17 00:00:00 2001 From: Chris White Date: Tue, 30 Apr 2019 22:49:14 -0700 Subject: [PATCH] Detects dynamic mgmt port in auto service registration. Fixes gh-561 Fixes gh-562 --- .../AbstractAutoServiceRegistration.java | 40 +++++++++++++------ ...oServiceRegistrationMgmtDisabledTests.java | 2 +- .../AbstractAutoServiceRegistrationTests.java | 2 +- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/serviceregistry/AbstractAutoServiceRegistration.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/serviceregistry/AbstractAutoServiceRegistration.java index 48f9c0aa4..58cd8bda9 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/serviceregistry/AbstractAutoServiceRegistration.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/serviceregistry/AbstractAutoServiceRegistration.java @@ -25,15 +25,17 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; -import org.springframework.boot.web.context.ConfigurableWebServerApplicationContext; +import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.boot.web.context.WebServerInitializedEvent; import org.springframework.cloud.client.discovery.ManagementServerPortUtils; import org.springframework.cloud.client.discovery.event.InstancePreRegisteredEvent; import org.springframework.cloud.client.discovery.event.InstanceRegisteredEvent; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.core.env.Environment; +import org.springframework.util.StringUtils; /** * Lifecycle methods that may be useful and common to {@link ServiceRegistry} @@ -43,9 +45,10 @@ * * @param Registration type passed to the {@link ServiceRegistry}. * @author Spencer Gibb + * @author Chris White */ public abstract class AbstractAutoServiceRegistration - implements AutoServiceRegistration, ApplicationContextAware, ApplicationListener { + implements AutoServiceRegistration, ApplicationContextAware, ApplicationListener { private static final Log logger = LogFactory.getLog(AbstractAutoServiceRegistration.class); @@ -63,6 +66,8 @@ public abstract class AbstractAutoServiceRegistration private AtomicInteger port = new AtomicInteger(0); + private AtomicInteger mgmtPort = new AtomicInteger(0); + private AutoServiceRegistrationProperties properties; @Deprecated @@ -81,21 +86,25 @@ protected ApplicationContext getContext() { } @Override - @SuppressWarnings("deprecation") - public void onApplicationEvent(WebServerInitializedEvent event) { - bind(event); + public void onApplicationEvent(ApplicationEvent event) { + if (event instanceof ApplicationReadyEvent) { + this.start(); + } + else if (event instanceof WebServerInitializedEvent) { + this.bind((WebServerInitializedEvent) event); + } } @Deprecated public void bind(WebServerInitializedEvent event) { - ApplicationContext context = event.getApplicationContext(); - if (context instanceof ConfigurableWebServerApplicationContext) { - if ("management".equals(((ConfigurableWebServerApplicationContext) context).getServerNamespace())) { - return; - } + String serverNamespace = event.getApplicationContext().getServerNamespace(); + + if (StringUtils.isEmpty(serverNamespace)) { + this.port.compareAndSet(0, event.getWebServer().getPort()); + } + else if ("management".equals(serverNamespace)) { + this.mgmtPort.compareAndSet(0, event.getWebServer().getPort()); } - this.port.compareAndSet(0, event.getWebServer().getPort()); - this.start(); } @Override @@ -185,7 +194,12 @@ protected String getManagementServiceName() { */ @Deprecated protected Integer getManagementPort() { - return ManagementServerPortUtils.getPort(this.context); + if (this.mgmtPort.get() != 0) { + return this.mgmtPort.get(); + } + else { + return ManagementServerPortUtils.getPort(this.context); + } } /** diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/serviceregistry/AbstractAutoServiceRegistrationMgmtDisabledTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/serviceregistry/AbstractAutoServiceRegistrationMgmtDisabledTests.java index 830372a23..6bc786012 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/serviceregistry/AbstractAutoServiceRegistrationMgmtDisabledTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/serviceregistry/AbstractAutoServiceRegistrationMgmtDisabledTests.java @@ -39,7 +39,7 @@ */ @RunWith(SpringRunner.class) @SpringBootTest(classes = AbstractAutoServiceRegistrationMgmtDisabledTests.Config.class, - properties = { "management.port=0", + properties = { "management.server.port=0", "spring.cloud.service-registry.auto-registration.register-management=false" }, webEnvironment = RANDOM_PORT) public class AbstractAutoServiceRegistrationMgmtDisabledTests { diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/serviceregistry/AbstractAutoServiceRegistrationTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/serviceregistry/AbstractAutoServiceRegistrationTests.java index f5f820f43..7e28872b4 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/serviceregistry/AbstractAutoServiceRegistrationTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/serviceregistry/AbstractAutoServiceRegistrationTests.java @@ -44,7 +44,7 @@ */ @RunWith(SpringRunner.class) // @checkstyle:off -@SpringBootTest(classes = AbstractAutoServiceRegistrationTests.Config.class, properties = "management.port=0", +@SpringBootTest(classes = AbstractAutoServiceRegistrationTests.Config.class, properties = "management.server.port=0", webEnvironment = RANDOM_PORT) // @checkstyle:on public class AbstractAutoServiceRegistrationTests {