自动检测到 rabbitConnectionFactory 以暴露 JMX
rabbitConnectionFactory autodetected for JMX exposure
我有一个 Spring 支持 Kafka 的启动应用程序。最近我试图让它也支持 RabbitMQ。我使用 @Profile
注释设置代码,以便仅当我 select spring.profiles.active
为 rabbit-mq
时,RabbitMQ 的所有新代码才应处于活动状态。同样,Kafka 特定代码由配置文件值 kafka
标记出来
我惊讶地发现,即使使用上述设置,当我将配置文件设置为 kafka
时,一些 RabbitMQ 仍然包含并激活,通过机制 JMX 暴露。具体来说,构造了一个 rabbitConnectionFactory
bean,然后它尝试在 localhost:5672
与 RabbitMQ 代理进行健康检查,但失败了。
在日志文件中,我看到了这些消息:
... 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
谢谢 Gary Russell 的建议。我尝试了他的方法并改变了我的 @SpringBootApplication
如下。这里的想法是在未定义 spring.rabbitmq.host
时排除 RabbitAutoConfiguration
(当 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
我可以接受构建 bean,只要我可以阻止它进行健康检查(或至少将其配置为使用我指定的主机和端口)。有办法吗?
您需要从类路径中排除 spring-rabbit jar 或通过从 @SpringBootApplication
.
中排除 RabbitAutoConfiguration
来禁用 rabbitmq auto-configuration
更新:禁用健康检查
参见boot properties documentation。具体设置 management.health.rabbit.enabled
为 false
我有一个 Spring 支持 Kafka 的启动应用程序。最近我试图让它也支持 RabbitMQ。我使用 @Profile
注释设置代码,以便仅当我 select spring.profiles.active
为 rabbit-mq
时,RabbitMQ 的所有新代码才应处于活动状态。同样,Kafka 特定代码由配置文件值 kafka
我惊讶地发现,即使使用上述设置,当我将配置文件设置为 kafka
时,一些 RabbitMQ 仍然包含并激活,通过机制 JMX 暴露。具体来说,构造了一个 rabbitConnectionFactory
bean,然后它尝试在 localhost:5672
与 RabbitMQ 代理进行健康检查,但失败了。
在日志文件中,我看到了这些消息:
... 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
谢谢 Gary Russell 的建议。我尝试了他的方法并改变了我的 @SpringBootApplication
如下。这里的想法是在未定义 spring.rabbitmq.host
时排除 RabbitAutoConfiguration
(当 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
我可以接受构建 bean,只要我可以阻止它进行健康检查(或至少将其配置为使用我指定的主机和端口)。有办法吗?
您需要从类路径中排除 spring-rabbit jar 或通过从 @SpringBootApplication
.
RabbitAutoConfiguration
来禁用 rabbitmq auto-configuration
更新:禁用健康检查
参见boot properties documentation。具体设置 management.health.rabbit.enabled
为 false