Приложение Spring-boot не может быть развернуто на PCF из-за RabbitServiceAutoConfiguration - PullRequest
0 голосов
/ 23 мая 2019

Я получил следующую ошибку:

Нет уникального интерфейса, соответствующего сервису org.springframework.amqp.rabbit.connection.ConnectionFactory найден

Описание:

  • RabbitMQ работает на платформе Pivotal Cloud Foundry на сервере Dev.
  • На платформе PCF НЕТ службы RabbitMQ (торговая площадка)
  • Приложение Springboot используетspring-cloud-starter-bus-amqp для подключения к RabbitMQ.
  • Если приложение Springboot работает локально, все работает как положено
  • Однако, когда cf push Приложение Springboot для PCF, я получил указанное выше исключение.
  • Основной причиной было то, что PCF использовал автоконфигурацию RabbitServiceAutoConfiguration.CloudProfile.CloudConnectors.UseCloudConnectors для создания rabbitmqConnectionFactory, и это, конечно, не удалось, поскольку в моем пространстве PCF вообще не было службы RabbitMQ.

Вопрос: Как настроить приложение Springboot и его можно без проблем развернуть на PCF?

Что я пробовал ... (ниже), и оно не сработало.

@Profile("cloud")
@Configuration
@EnableConfigurationProperties(RabbitmqInfo.class)
@Slf4j
public class RabbitmqConfig extends AbstractCloudConfig {

    @Bean
    public ConnectionFactory rabbitmqConnectionFactory(@Autowired RabbitmqInfo rabbitmq) {

        CachingConnectionFactory factory = new CachingConnectionFactory();
        factory.setHost(rabbitmq.getHost());
        factory.setPort(rabbitmq.getPort());
        factory.setUsername(rabbitmq.getUsername());
        factory.setPassword(rabbitmq.getPassword());

        log.info("[*] rabbitmqConnectionFactory uses CachingConnectionFactory");
        log.info("[*] rabbitmq.host: {}", factory.getHost());

        return factory;
    }

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory rabbitmqConnectionFactory) {
        return new RabbitTemplate(rabbitmqConnectionFactory);
    }

}

Мои build.gradle зависимости:

...
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-bus-amqp', version: '2.1.1.RELEASE'
...

Стекtrace:

scaAnnotationConfigApplicationContext: Исключительная ситуация, возникшая во время инициализации контекста - отмена попытки обновления: org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем rabbitConnectionFactory, определенного в org.springfrawork.cloud.stream.binder.rabbit.config.RabbitServiceAutoConfiguration $ CloudProfile $ CloudConnectors $ UseCloudConnectors: не удалось создать экземпляр компонента с помощью метода фабрики;вложенным исключением является org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр [org.springframework.amqp.rabbit.connection.ConnectionFactory]: метод фабрики 'rabbitConnectionFactory' вызвал исключение;вложенным исключением является org.springframework.cloud.CloudException: не найдено ни одного уникального сервиса, соответствующего интерфейсу org.springframework.amqp.rabbit.connection.ConnectionFactory.Ожидается 1, найдено 0

Спасибо за ваше время.

1 Ответ

0 голосов
/ 23 мая 2019

Изучив исходный код Spring Cloud Stream, я обнаружил решение, которое обошло конфигурацию облака для Rabbitmq на платформе. Таким образом, если у вас нет Rabbitmq на платформе PCF, вы все равно можете без проблем развернуть приложение Spring Boot на PCF. В моем случае Rabbitmq работает на сервере виртуальной машины Dev вне платформы.

В вашем application.properties установите следующее:

spring.cloud.stream.override-cloud-connectors=true
...