You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by wu...@apache.org on 2018/01/10 07:38:30 UTC

[incubator-servicecomb-java-chassis] 06/13: SCB-166 modify auto registration with spring boot

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 c70ab10d341ff34934a76904099247c305245576
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Tue Jan 9 10:09:01 2018 +0800

    SCB-166 modify auto registration with spring boot
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../java/io/servicecomb/metrics/common/Health.java |  26 ---
 .../core/publish/DefaultHealthCheckerManager.java  |  46 ++---
 .../metrics/core/TestHealthCheckerManager.java     | 217 ++++++++++++++++++++-
 .../CustomHealthCheckerAnnotation.java             |   7 +-
 4 files changed, 233 insertions(+), 63 deletions(-)

diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/Health.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/Health.java
deleted file mode 100644
index eb8c59f..0000000
--- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/Health.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.servicecomb.metrics.common;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
-
-@Target(value = {ElementType.TYPE})
-public @interface Health {
-
-}
diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java
index 9cb5cb3..667b02a 100644
--- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java
+++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java
@@ -19,8 +19,6 @@ package io.servicecomb.metrics.core.publish;
 
 import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
@@ -28,12 +26,10 @@ import java.util.stream.Collectors;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
-import org.springframework.core.type.filter.AnnotationTypeFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Component;
 
-import io.servicecomb.metrics.common.Health;
 import io.servicecomb.metrics.common.HealthCheckResult;
 import io.servicecomb.metrics.common.HealthChecker;
 import io.servicecomb.metrics.core.health.DefaultMicroserviceHealthChecker;
@@ -46,13 +42,21 @@ public class DefaultHealthCheckerManager implements HealthCheckerManager {
 
   private final Map<String, HealthChecker> healthCheckers;
 
-  public DefaultHealthCheckerManager() {
+  private ApplicationContext context;
+
+  @Autowired
+  public DefaultHealthCheckerManager(ApplicationContext context) {
+    this.context = context;
     this.healthCheckers = new ConcurrentHashMap<>();
     HealthChecker defaultHealthChecker = new DefaultMicroserviceHealthChecker();
     this.healthCheckers.put(defaultHealthChecker.getName(), defaultHealthChecker);
 
-    for (HealthChecker checker : getAllAnnotationHealthChecker()) {
-      this.healthCheckers.put(checker.getName(), checker);
+    for (String beanName : context.getBeanDefinitionNames()) {
+      Class<?> beanClass = context.getType(beanName);
+      if (HealthChecker.class.isAssignableFrom(beanClass)) {
+        Object bean = context.getBean(beanName);
+        this.healthCheckers.put(((HealthChecker) bean).getName(), (HealthChecker) bean);
+      }
     }
   }
 
@@ -74,28 +78,4 @@ public class DefaultHealthCheckerManager implements HealthCheckerManager {
     }
     throw new InvocationException(BAD_REQUEST, "HealthChecker name : " + name + " unregister");
   }
-
-  private List<HealthChecker> getAllAnnotationHealthChecker() {
-    List<HealthChecker> checkers = new ArrayList<>();
-    ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
-    scanner.addIncludeFilter(new AnnotationTypeFilter(Health.class));
-    for (BeanDefinition definition : scanner.findCandidateComponents("./")) {
-      try {
-        Class<?> beanClass = Class.forName(definition.getBeanClassName());
-        if (HealthChecker.class.isAssignableFrom(beanClass)) {
-          try {
-            checkers.add((HealthChecker) beanClass.getConstructor(null).newInstance());
-          } catch (Exception e) {
-            logger.error("construct health check class failed", e);
-          }
-        } else {
-          logger.error(
-              "health annotation class:" + definition.getBeanClassName() + " not implement HealthChecker interface");
-        }
-      } catch (ClassNotFoundException e) {
-        logger.error("health check class not found", e);
-      }
-    }
-    return checkers;
-  }
 }
diff --git a/metrics/metrics-core/src/test/java/io/servicecomb/metrics/core/TestHealthCheckerManager.java b/metrics/metrics-core/src/test/java/io/servicecomb/metrics/core/TestHealthCheckerManager.java
index db0fa35..9101fd1 100644
--- a/metrics/metrics-core/src/test/java/io/servicecomb/metrics/core/TestHealthCheckerManager.java
+++ b/metrics/metrics-core/src/test/java/io/servicecomb/metrics/core/TestHealthCheckerManager.java
@@ -18,10 +18,23 @@
 package io.servicecomb.metrics.core;
 
 import java.io.IOException;
+import java.lang.annotation.Annotation;
+import java.util.Locale;
 import java.util.Map;
 
 import org.junit.Assert;
 import org.junit.Test;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.MessageSourceResolvable;
+import org.springframework.context.NoSuchMessageException;
+import org.springframework.core.ResolvableType;
+import org.springframework.core.env.Environment;
+import org.springframework.core.io.Resource;
 
 import com.google.common.collect.Lists;
 
@@ -64,7 +77,209 @@ public class TestHealthCheckerManager {
       }
     };
 
-    HealthCheckerManager manager = new DefaultHealthCheckerManager();
+    HealthCheckerManager manager = new DefaultHealthCheckerManager(new ApplicationContext() {
+      @Override
+      public String getId() {
+        return null;
+      }
+
+      @Override
+      public String getApplicationName() {
+        return null;
+      }
+
+      @Override
+      public String getDisplayName() {
+        return null;
+      }
+
+      @Override
+      public long getStartupDate() {
+        return 0;
+      }
+
+      @Override
+      public ApplicationContext getParent() {
+        return null;
+      }
+
+      @Override
+      public AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException {
+        return null;
+      }
+
+      @Override
+      public BeanFactory getParentBeanFactory() {
+        return null;
+      }
+
+      @Override
+      public boolean containsLocalBean(String s) {
+        return false;
+      }
+
+      @Override
+      public boolean containsBeanDefinition(String s) {
+        return false;
+      }
+
+      @Override
+      public int getBeanDefinitionCount() {
+        return 0;
+      }
+
+      @Override
+      public String[] getBeanDefinitionNames() {
+        return new String[0];
+      }
+
+      @Override
+      public String[] getBeanNamesForType(ResolvableType resolvableType) {
+        return new String[0];
+      }
+
+      @Override
+      public String[] getBeanNamesForType(Class<?> aClass) {
+        return new String[0];
+      }
+
+      @Override
+      public String[] getBeanNamesForType(Class<?> aClass, boolean b, boolean b1) {
+        return new String[0];
+      }
+
+      @Override
+      public <T> Map<String, T> getBeansOfType(Class<T> aClass) throws BeansException {
+        return null;
+      }
+
+      @Override
+      public <T> Map<String, T> getBeansOfType(Class<T> aClass, boolean b, boolean b1) throws BeansException {
+        return null;
+      }
+
+      @Override
+      public String[] getBeanNamesForAnnotation(Class<? extends Annotation> aClass) {
+        return new String[0];
+      }
+
+      @Override
+      public Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> aClass) throws BeansException {
+        return null;
+      }
+
+      @Override
+      public <A extends Annotation> A findAnnotationOnBean(String s, Class<A> aClass)
+          throws NoSuchBeanDefinitionException {
+        return null;
+      }
+
+      @Override
+      public Object getBean(String s) throws BeansException {
+        return null;
+      }
+
+      @Override
+      public <T> T getBean(String s, Class<T> aClass) throws BeansException {
+        return null;
+      }
+
+      @Override
+      public <T> T getBean(Class<T> aClass) throws BeansException {
+        return null;
+      }
+
+      @Override
+      public Object getBean(String s, Object... objects) throws BeansException {
+        return null;
+      }
+
+      @Override
+      public <T> T getBean(Class<T> aClass, Object... objects) throws BeansException {
+        return null;
+      }
+
+      @Override
+      public boolean containsBean(String s) {
+        return false;
+      }
+
+      @Override
+      public boolean isSingleton(String s) throws NoSuchBeanDefinitionException {
+        return false;
+      }
+
+      @Override
+      public boolean isPrototype(String s) throws NoSuchBeanDefinitionException {
+        return false;
+      }
+
+      @Override
+      public boolean isTypeMatch(String s, ResolvableType resolvableType) throws NoSuchBeanDefinitionException {
+        return false;
+      }
+
+      @Override
+      public boolean isTypeMatch(String s, Class<?> aClass) throws NoSuchBeanDefinitionException {
+        return false;
+      }
+
+      @Override
+      public Class<?> getType(String s) throws NoSuchBeanDefinitionException {
+        return null;
+      }
+
+      @Override
+      public String[] getAliases(String s) {
+        return new String[0];
+      }
+
+      @Override
+      public void publishEvent(ApplicationEvent applicationEvent) {
+
+      }
+
+      @Override
+      public void publishEvent(Object o) {
+
+      }
+
+      @Override
+      public String getMessage(String s, Object[] objects, String s1, Locale locale) {
+        return null;
+      }
+
+      @Override
+      public String getMessage(String s, Object[] objects, Locale locale) throws NoSuchMessageException {
+        return null;
+      }
+
+      @Override
+      public String getMessage(MessageSourceResolvable messageSourceResolvable, Locale locale)
+          throws NoSuchMessageException {
+        return null;
+      }
+
+      @Override
+      public Environment getEnvironment() {
+        return null;
+      }
+
+      @Override
+      public Resource[] getResources(String s) throws IOException {
+        return new Resource[0];
+      }
+
+      @Override
+      public Resource getResource(String s) {
+        return null;
+      }
+
+      @Override
+      public ClassLoader getClassLoader() {
+        return null;
+      }
+    });
     Map<String, HealthCheckResult> results = manager.check();
 
     Assert.assertTrue(results.get("default").isHealthy());
diff --git a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthCheckerAnnotation.java b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthCheckerAnnotation.java
index 6816abd..ba6fb7a 100644
--- a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthCheckerAnnotation.java
+++ b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthCheckerAnnotation.java
@@ -17,12 +17,13 @@
 
 package io.servicecomb.samples.metrics.extendhealthcheck;
 
-import io.servicecomb.metrics.common.Health;
+import org.springframework.stereotype.Component;
+
 import io.servicecomb.metrics.common.HealthCheckResult;
 import io.servicecomb.metrics.common.HealthChecker;
 
-//this health check will auto register because Health Annotation
-@Health
+//this health check will auto register because spring bean annotation
+@Component
 public class CustomHealthCheckerAnnotation implements HealthChecker {
   @Override
   public String getName() {

-- 
To stop receiving notification emails like this one, please contact
"commits@servicecomb.apache.org" <co...@servicecomb.apache.org>.