应用未向领事注册服务

时间:2019-01-08 10:19:10

标签: java spring spring-cloud spring-cloud-consul

我的应用程序未向Consul注册服务。我跟踪了源代码,该问题似乎没有调用AbstractAutoServiceRegistration的bind方法。如果我正确理解,则绑定逻辑位于org.springframework.cloud.consul.serviceregistry.ConsulAutoServiceRegistrationAutoConfiguration中,它定义了一个类型为ConsulAutoServiceRegistration的bean。 ConsulAutoServiceRegistration类是从AbstractAutoServiceRegistration扩展的。

@Bean
@ConditionalOnMissingBean
public ConsulAutoServiceRegistration consulAutoServiceRegistration(
        ConsulServiceRegistry registry,
        AutoServiceRegistrationProperties autoServiceRegistrationProperties,
        ConsulDiscoveryProperties properties,
        ConsulAutoRegistration consulRegistration) {
    return new ConsulAutoServiceRegistration(registry,
            autoServiceRegistrationProperties, properties, consulRegistration);
}

然后@EventListener(WebServerInitializedEvent.class)注释了AbstractAutoServiceRegistration中名为bind的方法。

@EventListener(WebServerInitializedEvent.class)
public void bind(WebServerInitializedEvent event) {
    ApplicationContext context = event.getApplicationContext();
    if (context instanceof ConfigurableWebServerApplicationContext) {
        if ("management".equals(
                ((ConfigurableWebServerApplicationContext) context).getServerNamespace())) {
            return;
        }
    }
    this.port.compareAndSet(0, event.getWebServer().getPort());
    this.start();
}

但是我发现此方法未在侦听器中注册,因为AbstractAutoServiceRegistration的软件包以“ org.springframework”开头。因此在EventListenerMethodProcessor中已将其忽略。

private void processBean(final String beanName, final Class<?> targetType) {
    if (!this.nonAnnotatedClasses.contains(targetType) && !isSpringContainerClass(targetType)) {
...

}

private static boolean isSpringContainerClass(Class<?> clazz) {
    return (clazz.getName().startsWith("org.springframework.") &&
            !AnnotatedElementUtils.isAnnotated(ClassUtils.getUserClass(clazz), Component.class));
}

出什么问题了?而我该如何解决?

0 个答案:

没有答案
相关问题