【问题标题】:Spring-Boot disable load-on startup rabbitMQSpring-Boot禁用加载启动rabbitMQ
【发布时间】:2016-07-01 14:45:55
【问题描述】:

为什么在构建 spring-boot jar 时触发或运行 RabbitMQ。在运行 Application.java 或 pom.xml 时。

我可以看到以下记录器

2016-07-01 16:40:04.334  INFO 7004 --- [           main] com.rabbit.App                                : No active profile set, falling back to default profiles: default
2016-07-01 16:40:04.391  INFO 7004 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing    org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@1da51a35: startup date [Fri Jul 01 16:40:04 CEST 2016]; root of context hierarchy
2016-07-01 16:40:05.331  INFO 7004 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'rabbitListenerContainerFactory' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=rabbitMqConfiguration; factoryMethodName=rabbitListenerContainerFactory; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/rabbit/messaging/configuration/RabbitMqConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=taskConsumerConfiguration; factoryMethodName=rabbitListenerContainerFactory; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/rabbit/messaging/configuration/TaskConsumerConfiguration.class]]
2016-07-01 16:40:05.334  INFO 7004 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'connectionFactory' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=rabbitMqConfiguration; factoryMethodName=connectionFactory; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/rabbit/messaging/configuration/RabbitMqConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=taskConsumerConfiguration; factoryMethodName=connectionFactory; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/rabbit/messaging/configuration/TaskConsumerConfiguration.class]]
2016-07-01 16:40:05.334  INFO 7004 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'jsonMessageConverter' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=rabbitMqConfiguration; factoryMethodName=jsonMessageConverter; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/rabbit/messaging/configuration/RabbitMqConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=taskConsumerConfiguration; factoryMethodName=jsonMessageConverter; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/rabbit/messaging/configuration/TaskConsumerConfiguration.class]]
2016-07-01 16:40:05.868  INFO 7004 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.amqp.rabbit.annotation.RabbitBootstrapConfiguration' of type [class org.springframework.amqp.rabbit.annotation.RabbitBootstrapConfiguration$$EnhancerBySpringCGLIB$$ad9295b0] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2016-07-01 16:40:06.657  INFO 7004 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)

是否有任何选项可以禁用此功能?

在测试阶段构建 jar 时,它会引发以下异常。

LifecycleProcessor with name 'lifecycleProcessor': using default  [org.springframework.context.support.DefaultLifecycleProcessor@76dc36e5]
2016-06-30 15:10:32.989  WARN 21614 --- [cTaskExecutor-1] o.s.a.r.l.SimpleMessageListenerContainer : Consumer raised exception, processing can restart if the connection factory supports it

org.springframework.amqp.AmqpIOException: java.net.SocketTimeoutException: connect timed out
at     org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:67)
at 

【问题讨论】:

  • 这只是 bean 声明的东西——你到底有什么问题?
  • RabbitMQ 主机属性在 application.properties 中定义,当我们构建应用程序时,我们将通过使用构建脚本动态传递这些属性。在测试阶段构建 jar 时,它会引发以下异常。 org.springframework.amqp.AmqpIOException: java.net.SocketTimeoutException: 连接超时
  • @Gary Russell 在构建 jar 时 Spring-boot 试图建立 RabbitMQ 连接。有没有办法通过延迟加载来实现?我的意思是按需而不是在启动时?我也试过了遵循注释@EnableAutoConfiguration(exclude=RabbitAutoConfiguration.class) 但没有运气。至少我们应该延迟加载 SimpleMessageListenerContainer。延迟加载 RabbitMQ 连接或 SimpleMessageListenerContainer 的任何可能性?

标签: spring-boot spring-rabbit


【解决方案1】:

当您多次定义具有该名称的 bean 时,您会收到日志条目“Overriding bean definition..”。

这就引出了一个问题,您使用至少两个 bean 中的哪一个以及它们是如何配置的?

在 rabbitListenerContainerFactory bean 的构造函数上设置断点并查看您正在创建哪些实例。

查找堆栈跟踪可能会为您提供有关创建此 bean 的原因的信息,因此您可以从 spring 配置中删除重复项。

您还可以添加断点,设置兔子连接属性。

当给定的 ip 错误时,也会出现“连接超时”。

无论如何,我不建议在构建脚本中设置属性,而是在启动应用程序时在命令行上指向属性文件。这使您可以在不同的环境中使用您的构建。

howto-properties-and-configuration

为什么在建罐子的时候会扔东西? 您写道,您在构建期间使用脚本设置属性。

这意味着测试正在使用这些属性,而现在测试失败了,可能是因为使用提供的属性无法访问 rabbit mq 服务器或未启动。

只要你覆盖 bean,你并不真正知道你使用了哪个实例,所以你并不真正知道你使用了哪些属性。 尝试注销它,我相信你会看到......

【讨论】:

  • 感谢您的回复。我不希望spring-rabbit.ex自动提供几个bean)connectionFactory,ListernerContainerFactory。所以我根据我的要求手动配置了这些bean。所以信息消息是有效的但是为什么在构建jar时它会抛出?跨度>
【解决方案2】:

您不能“延迟加载”实现 SmartLifecycle 的 bean(例如侦听器容器),因为上下文必须加载 bean 以调用 isAutoStartup() 以查看是否应该启动 bean。

如果在“构建 jar”时正在加载上下文,则您必须有使用 bean 的测试用例。您可以将 autoStartup 设置为 false - 但您的测试可能会失败。

您可以跳过使用 -DskipTests=true (maven) 或 -x test (gradle) 运行测试。

【讨论】:

    【解决方案3】:

    我在测试中遇到了同样的问题。我不使用rabbit,因为超时发生测试持续时间增加。

    作为一种简单的解决方法,您可以在使用 spring 配置文件的测试期间禁用队列、交换等的配置。

    例子:

    如果存在弹簧配置文件“no_rabbit”,则具有禁用的配置。

    @Configuration
    @Profile("!no_rabbit")
    public class RabbitMQConfig {
    
        @Bean
        public Queue queue() {
            return QueueBuilder.durable("NAMW").withArgument("x-message-ttl", 3600).build();
        }
    
        // more definitions of bean, exchanges etc.
    
    }
    

    然后,在测试中只需添加配置文件“no_rabbit”。

    @RunWith(SpringRunner.class)
    @ActiveProfiles({ "no_rabbit" })
    public class TestClass {
         ...
    }
    

    这种方法的缺点是您必须在每个不使用 rabbit 的测试中添加配置文件。但就我而言,除非我有更好的解决方案,否则没关系。

    【讨论】:

      猜你喜欢
      • 2020-11-25
      • 2016-10-09
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 2023-03-21
      • 2019-06-03
      相关资源
      最近更新 更多