This is an automated email from the ASF dual-hosted git repository. wujimin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit f1a110eec3e5b26b5a07cd21a26380090794a39f Author: wujimin <wuji...@huawei.com> AuthorDate: Wed Apr 4 09:05:08 2018 +0800 SCB-422 metrics shutdown when chassis close --- .../foundation/metrics/MetricsBootstrap.java | 8 +++ .../foundation/metrics/MetricsInitializer.java | 8 +++ .../foundation/metrics/TestMetricsBootstrap.java | 58 +++++++++++++++++++--- .../metrics/core/MetricsBootListener.java | 2 + 4 files changed, 70 insertions(+), 6 deletions(-) diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java index 0c6a523..335d7c5 100644 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java +++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java @@ -16,6 +16,8 @@ */ package org.apache.servicecomb.foundation.metrics; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -52,6 +54,12 @@ public class MetricsBootstrap { public void shutdown() { executorService.shutdown(); + + List<MetricsInitializer> initializers = new ArrayList<>(SPIServiceUtils.getSortedService(MetricsInitializer.class)); + Collections.reverse(initializers); + initializers.forEach(initializer -> { + initializer.uninit(); + }); } protected void loadMetricsInitializers() { diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsInitializer.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsInitializer.java index 5e1aaef..3556576 100644 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsInitializer.java +++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsInitializer.java @@ -20,8 +20,16 @@ import com.google.common.eventbus.EventBus; import com.netflix.spectator.api.CompositeRegistry; public interface MetricsInitializer { + default int getOrder() { + return 0; + } + /** * if create new registry, must add to globalRegistry */ void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config); + + default void uninit() { + + } } diff --git a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsBootstrap.java b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsBootstrap.java index b8280f4..a8fd7ec 100644 --- a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsBootstrap.java +++ b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsBootstrap.java @@ -19,10 +19,10 @@ package org.apache.servicecomb.foundation.metrics; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.ScheduledExecutorService; import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils; import org.hamcrest.Matchers; -import org.junit.After; import org.junit.Assert; import org.junit.Test; @@ -31,6 +31,7 @@ import com.google.common.eventbus.Subscribe; import com.netflix.spectator.api.CompositeRegistry; import com.netflix.spectator.api.Meter; +import mockit.Deencapsulation; import mockit.Expectations; import mockit.Mocked; @@ -42,11 +43,6 @@ public class TestMetricsBootstrap { EventBus eventBus = new EventBus(); - @After - public void teardown() { - bootstrap.shutdown(); - } - @Test public void loadMetricsInitializers() { List<MetricsInitializer> initList = new ArrayList<>(); @@ -64,6 +60,7 @@ public class TestMetricsBootstrap { }; bootstrap.start(globalRegistry, eventBus); + bootstrap.shutdown(); Assert.assertThat(initList, Matchers.contains(metricsInitializer, metricsInitializer)); } @@ -89,7 +86,56 @@ public class TestMetricsBootstrap { }); bootstrap.pollMeters(); + bootstrap.shutdown(); Assert.assertEquals(meters, result.getMeters()); } + + @Test + public void shutdown(@Mocked ScheduledExecutorService scheduledExecutorService) { + List<MetricsInitializer> uninitList = new ArrayList<>(); + MetricsInitializer initializer1 = new MetricsInitializer() { + @Override + public int getOrder() { + return 1; + } + + @Override + public void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { + } + + @Override + public void uninit() { + uninitList.add(this); + } + }; + + MetricsInitializer initializer2 = new MetricsInitializer() { + @Override + public int getOrder() { + return 2; + } + + @Override + public void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { + } + + @Override + public void uninit() { + uninitList.add(this); + } + }; + + new Expectations(SPIServiceUtils.class) { + { + SPIServiceUtils.getSortedService(MetricsInitializer.class); + result = Arrays.asList(initializer1, initializer2); + } + }; + Deencapsulation.setField(bootstrap, "executorService", scheduledExecutorService); + + bootstrap.shutdown(); + + Assert.assertThat(uninitList, Matchers.contains(initializer2, initializer1)); + } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java index 289c879..51b7bfc 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java @@ -48,6 +48,8 @@ public class MetricsBootListener implements BootListener { case AFTER_REGISTRY: metricsBootstrap.start(Spectator.globalRegistry(), EventManager.getEventBus()); break; + case BEFORE_CLOSE: + metricsBootstrap.shutdown(); default: break; } -- To stop receiving notification emails like this one, please contact wuji...@apache.org.