为什么在构建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
答案 0 :(得分:0)
当您多次定义具有该名称的bean时,您将获得日志条目'Overriding bean definition ..'。
这导致了一个问题,您使用哪个,至少两个bean,以及它们是如何配置的?
在rabbitListenerContainerFactory bean的构造函数上设置断点,并查看您正在创建的实例。
查找堆栈跟踪可能会为您提供有关此bean创建原因的信息,因此您可以从弹簧配置中删除重复项。
您还可以添加设置了兔子连接属性的断点。
当给定的ip错误时,也会出现“connect timed out”。
无论如何,我不建议在构建脚本中设置属性,而是在启动应用程序时指向命令行上的属性文件。这允许您在不同的环境中使用您的构建。
请参阅howto-properties-and-configuration
为什么在制作jar时会抛出? 您写道,您在构建期间使用脚本设置属性。
这意味着测试正在使用这些属性,现在测试失败,可能是因为兔子mq服务器无法使用提供的属性访问或未启动。
只要你覆盖bean,你就不知道你使用的是哪个实例,所以你真的不知道你使用了哪些属性。 尝试记录下来,但我相信你会看到......
答案 1 :(得分:0)
你不能懒得加载"实现SmartLifecycle
的bean(例如监听器容器),因为上下文必须加载bean以调用isAutoStartup()
以查看是否应该启动bean。
如果在构建jar"时正在加载上下文,则必须具有使用bean的测试用例。您可以将autoStartup
设置为false
- 但您的测试可能会失败。
您可以跳过使用-DskipTests=true
(maven)或-x test
(gradle)运行测试。
答案 2 :(得分:0)
我的测试中遇到同样的问题。我不使用兔子,因为超时发生了测试持续时间的增加。
作为一种简单的解决方法,您可以在使用弹簧配置文件的测试期间禁用队列,交换等的配置。
示例:
如果弹簧配置文件“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 {
...
}
这种方法的缺点是你必须在每次不使用兔子的测试中添加配置文件。但是对于我的情况来说,只要我有更好的解决方案就可以了。