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 <[email protected]> AuthorDate: Tue Jan 9 10:09:01 2018 +0800 SCB-166 modify auto registration with spring boot Signed-off-by: zhengyangyong <[email protected]> --- .../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 "[email protected]" <[email protected]>.
