1

我的应用程序没有向 Consul 注册服务。我跟踪了源代码,问题似乎是 AbstractAutoServiceRegistration 的绑定方法没有调用。如果我理解正确,绑定逻辑在 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);
}

然后AbstractAutoServiceRegistration中一个名为bind的方法被@EventListener(WebServerInitializedEvent.class)注解。

@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));
}

问题是什么?我该如何解决?

4

0 回答 0