diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/RefreshEndpoint.java b/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/RefreshEndpoint.java index b995141e..ae5c257f 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/RefreshEndpoint.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/RefreshEndpoint.java @@ -73,8 +73,8 @@ public class RefreshEndpoint extends AbstractEndpoint> { addConfigFilesToEnvironment(); Set keys = changes(before, extract(this.context.getEnvironment().getPropertySources())).keySet(); - this.scope.refreshAll(); this.context.publishEvent(new EnvironmentChangeEvent(keys)); + this.scope.refreshAll(); return keys.toArray(new String[keys.size()]); } diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/config/RefreshEndpointTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/endpoint/RefreshEndpointTests.java similarity index 60% rename from spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/config/RefreshEndpointTests.java rename to spring-cloud-context/src/test/java/org/springframework/cloud/endpoint/RefreshEndpointTests.java index 361a9532..a37c36be 100644 --- a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/config/RefreshEndpointTests.java +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/endpoint/RefreshEndpointTests.java @@ -14,19 +14,25 @@ * limitations under the License. */ -package org.springframework.cloud.bootstrap.config; +package org.springframework.cloud.endpoint; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import org.junit.Test; import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.cloud.context.scope.refresh.RefreshScope; -import org.springframework.cloud.endpoint.RefreshEndpoint; +import org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent; +import org.springframework.context.ApplicationEvent; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; +import org.springframework.context.event.EventListener; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -36,6 +42,20 @@ import org.springframework.util.ReflectionUtils; */ public class RefreshEndpointTests { + @Test + public void eventsPublishedInOrder() throws Exception { + ConfigurableApplicationContext context = new SpringApplicationBuilder(Empty.class) + .web(false).showBanner(false).run(); + RefreshScope scope = new RefreshScope(); + scope.setApplicationContext(context); + RefreshEndpoint endpoint = new RefreshEndpoint(context, scope); + Empty empty = context.getBean(Empty.class); + endpoint.invoke(); + int after = empty.events.size(); + assertEquals("Shutdown hooks not cleaned on refresh", 2, after); + assertTrue(empty.events.get(0) instanceof EnvironmentChangeEvent); + } + @Test public void shutdownHooksCleaned() { ConfigurableApplicationContext context = new SpringApplicationBuilder(Empty.class) @@ -61,6 +81,14 @@ public class RefreshEndpointTests { @Configuration protected static class Empty { - + private List events = new ArrayList(); + @EventListener(EnvironmentChangeEvent.class) + public void changed(EnvironmentChangeEvent event) { + this.events.add(event); + } + @EventListener(RefreshScopeRefreshedEvent.class) + public void refreshed(RefreshScopeRefreshedEvent event) { + this.events.add(event); + } } }