Подключение Spring boot 2 к rabbitmq через Apache Camel

#java #spring #spring-boot #rabbitmq #apache-camel

#java #spring #spring-загрузка #rabbitmq #apache-camel

Вопрос:

У меня проблема с подключением к rabbitmq через Apache Camel при весенней загрузке 2.

Я выполнил следующие шаги:

Мои зависимости:

 implementation "org.apache.camel:camel-spring-boot-starter:${camelVersion}"
implementation "org.apache.camel:camel-jackson-starter:${camelVersion}"
implementation "org.apache.camel:camel-core:${camelVersion}"
implementation "org.apache.camel:camel-rabbitmq-starter:${camelVersion}"
implementation "org.springframework.boot:spring-boot-starter-amqp"
  

Application.yaml

 spring:
      rabbitmq:
      dynamic: true
      host: 192.168.1.1
      port: 5672
      username: X
      password: Y
  

И у меня есть следующий маршрут:

 @Component
public class BasicRoute extends RouteBuilder {

@Override
public void configure() throws Exception {

    from("direct:loggerQueue")
            .id("loggerQueue")
            .to("rabbitmq://TEST-QUEUE.exchange?queue=TEST-QUEUE.queueamp;autoDelete=falseamp;connectionFactory=#rabbitConnectionFactory")
            .end();
}
  

}

Наконец, у меня все еще следующая проблема:

2019-03-06 12:46:05.766 ПРЕДУПРЕЖДЕНИЕ 19464 — [restartedMain] o.a.c.c.rabbitmq.RabbitMQProducer : Не удалось создать соединение. Он попытается подключиться снова при публикации сообщения. java.net.ConnectException: отказано в подключении: подключитесь

Подключение кажется нормальным, я его протестировал. Что-то не так с rabbitConnectionFactory.

Я не знаю, что у меня плохо.

Комментарии:

1. вы пытались изменить префикс свойств с spring.rabbit на camel.component.rabbitmq ?

2. Все та же ошибка.

Ответ №1:

Проблема, по-видимому, заключается в том, что RabbitMQComponent ожидает найти фабрику соединений типа com.rabbitmq.client.ConnectionFactory.

Однако автоматическая настройка springboot создает фабрику соединений типа org.springframework.amqp.rabbit.connection.CachingConnectionFactory.

Итак, всякий раз, когда RabbitMQComponent пытается найти соответствующую фабрику соединений, поскольку он ищет определенный тип и поскольку он не относится к подклассу rabbitmq ConnectionFactory, он возвращает нулевое значение и не может использовать подходящее имя хоста и параметры конфигурации, указанные в вашем application.yml.

 You should also see the following in your log if you have debug level set:
2019-12-15 17:58:53.631 DEBUG 48710 --- [           main] o.a.c.c.rabbitmq.RabbitMQComponent       : Creating RabbitMQEndpoint with host null:0 and exchangeName: asterix
2019-12-15 17:58:55.927 DEBUG 48710 --- [           main] o.a.c.c.rabbitmq.RabbitMQComponent       : Creating RabbitMQEndpoint with host null:0 and exchangeName: asterix-sink
  

Редактировать:
CachingConnectionFactory настроен с использованием требуемой фабрики подключений Rabbit как часть автоматической настройки. Однако вам необходимо предоставить ссылку на правильную фабрику.

Следовательно, вам нужно добавить @Bean для устранения неоднозначности.

 @Configuration
@RequiredArgsConstructor
public class CamelConfig {

  private final CachingConnectionFactory rabbitConnectionFactory;

  @Bean
  com.rabbitmq.client.ConnectionFactory rabbitSourceConnectionFactory() {
    return rabbitConnectionFactory.getRabbitConnectionFactory();
  }
}
  

и в вашей конфигурации конечной точки:

 rabbitmq:asterix?connectionFactory=#rabbitSourceConnectionFactory
  

Обратите внимание, что # является необязательным, поскольку он удаляется в коде, когда он пытается найти компонент rabbit connection factory.

В вашем application.yml настройте параметры подключения (URL-адрес больше не включается в URI конечной точки).

 spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest