У меня есть приложение Spring Boot, которое поддерживает Kafka.В последнее время я пытаюсь сделать так, чтобы он также поддерживал RabbitMQ.Я настроил код, используя аннотацию @Profile
, чтобы весь новый код для RabbitMQ был активным, только если я выбрал spring.profiles.active
, чтобы быть rabbit-mq
.Аналогичным образом, код, специфичный для Kafka, выделен значением профиля kafka
. Я был удивлен, увидев, что даже при вышеупомянутой настройке, когда я устанавливаю профиль на kafka
, некоторые RabbitMQ все еще работают.включается и активируется через механизм выдержка JMX .В частности, был создан bean-компонент rabbitConnectionFactory
, а затем он попытался выполнить проверку работоспособности с помощью брокера RabbitMQ на localhost:5672
и не смог.
В файле журнала я увидел следующие сообщения:
... o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
... o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'rabbitConnectionFactory' has been autodetected for JMX exposure
... o.s.j.e.a.AnnotationMBeanExporter : Located managed bean 'rabbitConnectionFactory': registering with JMX server as MBean [org.springframework.amqp.rabbit.connection:name=rabbitConnectionFactory,type=CachingConnectionFactory]
... o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 2147483547
... o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 2147483647
... o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
... c.s.datacomparatorproducer.Application : Started Application in 5.175 seconds (JVM running for 5.663)
... o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet'
... o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started
... o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 15 ms
... o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:5672]
... o.s.b.a.amqp.RabbitHealthIndicator : Rabbit health check failed
org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused (Connection refused)
at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:62) ~[spring-rabbit-2.0.3.RELEASE.jar!/:2.0.3.RELEASE]
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:476) ~[spring-rabbit-2.0.3.RELEASE.jar!/:2.0.3.RELEASE]
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:614) ~[spring-rabbit-2.0.3.RELEASE.jar!/:2.0.3.RELEASE]
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.createConnection(ConnectionFactoryUtils.java:240) ~[spring-rabbit-2.0.3.RELEASE.jar!/:2.0.3.RELEASE]
at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1797) ~[spring-rabbit-2.0.3.RELEASE.jar!/:2.0.3.RELEASE]
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1771) ~[spring-rabbit-2.0.3.RELEASE.jar!/:2.0.3.RELEASE]
У меня два вопроса:
- Как можно избежать включения кода RabbitMQ?Почему мои настройки с использованием
@Profile
не работали должным образом? - Как мне настроить
rabbitConnectionFactory
?В настоящее время он пытается поговорить с localhost:5672
.Я знаю, как вообще настроить шаблон Spring для использования application-xxx.properties
для spring.rabbitmq.{host,port}
, но в этом случае, поскольку код включен автоматически, я не знаю, как настроить rabbitConnectionFactory
Обычная конфигурация
spring.rabbitmq.host=someRabbitBroker
spring.rabbitmq.port=5672
Обновление
Попытка 1: исключая RabbitAutoConfiguration
Спасибо Гэри Расселу за предложение.Я попробовал его метод и изменил свой @SpringBootApplication
следующим образом.Идея здесь состоит в том, чтобы исключить RabbitAutoConfiguration
, когда spring.rabbitmq.host
НЕ определен (когда профиль rabbit-mq
не активен):
@SpringBootApplication
public class Application {
@ConditionalOnProperty(value="spring.rabbitmq.host")
@Bean
RabbitAutoConfiguration rabbitAutoConfiguration(){
return new RabbitAutoConfiguration();
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Я не уверен, является ли этот код правильным способомсделать это, но это не сработало.Когда мое приложение запустилось, я все еще видел это в сообщении:
... o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
... o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'rabbitConnectionFactory' has been autodetected for JMX exposure
... o.s.j.e.a.AnnotationMBeanExporter : Located managed bean 'rabbitConnectionFactory': registering with JMX server as MBean [org.springframework.amqp.rabbit.connection:name=rabbitConnectionFactory,type=CachingConnectionFactory]
... o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 2147483547
Я в порядке с созданием компонента, пока я могу мешать ему выполнять проверку работоспособности (или, по крайней мере, настроить его на использованиемой назначенный хост и порт).Есть ли способ сделать это?