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>.