Приложение не регистрирует сервис в Консуле - PullRequest
0 голосов
/ 08 января 2019

Мое приложение не регистрирует сервис в Консуле. Я отслеживал исходный код, проблема выглядит так, как будто метод привязки AbstractAutoServiceRegistration не вызывает. Если я правильно понимаю, логика привязки находится в org.springframework.cloud.consul.serviceregistry.ConsulAutoServiceRegistrationAutoConfiguration, она определила компонент, тип которого является ConsulAutoServiceRegistration. Класс ConsulAutoServiceRegistration расширен от класса AbstractAutoServiceRegistration.

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

Затем метод с именем bind в AbstractAutoServiceRegistration аннотируется @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));
}

В чем проблема? И как я могу это исправить?

...