From 42b21d8399a1c797bca79efa7bbddef629cc1fdc Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Mon, 8 Feb 2016 17:04:41 -0700 Subject: [PATCH] Move RefreshEvent and Listener from consul/zk --- .../RefreshEndpointAutoConfiguration.java | 6 +++ .../cloud/endpoint/event/RefreshEvent.java | 28 +++++++++++++ .../endpoint/event/RefreshEventListener.java | 39 +++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEvent.java create mode 100644 spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEventListener.java diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshEndpointAutoConfiguration.java b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshEndpointAutoConfiguration.java index 347bb2a8..2d113cc4 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshEndpointAutoConfiguration.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshEndpointAutoConfiguration.java @@ -38,6 +38,7 @@ import org.springframework.cloud.context.properties.ConfigurationPropertiesRebin import org.springframework.cloud.context.restart.RestartEndpoint; import org.springframework.cloud.context.scope.refresh.RefreshScope; import org.springframework.cloud.endpoint.RefreshEndpoint; +import org.springframework.cloud.endpoint.event.RefreshEventListener; import org.springframework.cloud.health.RefreshScopeHealthIndicator; import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; @@ -117,6 +118,11 @@ public class RefreshEndpointAutoConfiguration { return endpoint; } + @Bean + public RefreshEventListener refreshEventListener(RefreshEndpoint refreshEndpoint) { + return new RefreshEventListener(refreshEndpoint); + } + } private static class InfoEndpointRebinderConfiguration diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEvent.java b/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEvent.java new file mode 100644 index 00000000..4e79b6eb --- /dev/null +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEvent.java @@ -0,0 +1,28 @@ +package org.springframework.cloud.endpoint.event; + +import org.springframework.cloud.endpoint.RefreshEndpoint; +import org.springframework.context.ApplicationEvent; + +/** + * Event that triggers a call to {@link RefreshEndpoint#refresh()} + * @author Spencer Gibb + */ +public class RefreshEvent extends ApplicationEvent { + + private Object event; + private String eventDesc; + + public RefreshEvent(Object source, Object event, String eventDesc) { + super(source); + this.event = event; + this.eventDesc = eventDesc; + } + + public Object getEvent() { + return this.event; + } + + public String getEventDesc() { + return this.eventDesc; + } +} diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEventListener.java b/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEventListener.java new file mode 100644 index 00000000..4cda9706 --- /dev/null +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEventListener.java @@ -0,0 +1,39 @@ +package org.springframework.cloud.endpoint.event; + +import java.util.Arrays; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.cloud.endpoint.RefreshEndpoint; +import org.springframework.context.event.EventListener; + +import lombok.extern.apachecommons.CommonsLog; + +/** + * Calls {@link RefreshEndpoint#refresh()} when a {@link RefreshEvent} is received. + * Only responds to {@link RefreshEvent} after receiving an {@link ApplicationReadyEvent} as the RefreshEvent's might come to early in the application lifecycle. + * @author Spencer Gibb + */ +@CommonsLog +public class RefreshEventListener { + private RefreshEndpoint refresh; + private AtomicBoolean ready = new AtomicBoolean(false); + + public RefreshEventListener(RefreshEndpoint refresh) { + this.refresh = refresh; + } + + @EventListener + public void handle(ApplicationReadyEvent event) { + this.ready.compareAndSet(false, true); + } + + @EventListener + public void handle(RefreshEvent event) { + if (this.ready.get()) { // don't handle events before app is ready + log.debug("Event received " + event.getEventDesc()); + String[] keys = this.refresh.refresh(); + log.info("Refresh keys changed: " + Arrays.asList(keys)); + } + } +}