Spring-Boot отключает загрузку при запуске RabbitMQ

Почему RabbitMQ запускается или запускается при создании jar-файла spring-boot. При запуске 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)

Есть ли возможность отключить это?

При создании банки на этапе тестирования выдается следующее исключение.

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 

person VelNaga    schedule 01.07.2016    source источник
comment
Это просто декларация bean-компонента - какая именно у вас проблема?   -  person Gary Russell    schedule 01.07.2016
comment
Свойства хоста RabbitMQ определены в application.properties, пока мы создаем приложение, мы будем передавать эти свойства динамически с помощью скрипта сборки. при создании банки на этапе тестирования выдается следующее исключение. org.springframework.amqp.AmqpIOException: java.net.SocketTimeoutException: время ожидания подключения истекло   -  person VelNaga    schedule 01.07.2016
comment
@ Гэри Рассел во время сборки jar Spring-boot пытался установить соединение RabbitMQ. Можно ли как-то сделать это с помощью отложенной загрузки? Я имею в виду по запросу, а не при запуске? .class), но не повезло. По крайней мере, мы должны лениво загружать SimpleMessageListenerContainer. Любые возможности ленивой загрузки соединения RabbitMQ или SimpleMessageListenerContainer?   -  person VelNaga    schedule 03.07.2016


Ответы (3)


Вы получаете запись в журнале «Переопределение определения bean-компонента..», когда вы определяете bean-компонент с этим именем более одного раза.

Это приводит к вопросу, какой из, по крайней мере, двух bean-компонентов вы используете и как они настроены?

Установите точки останова на конструкторе bean-компонента rabbitListenerContainerFactory и посмотрите, какие экземпляры вы создаете.

Просмотр трассировки стека может дать вам информацию о том, почему этот bean-компонент создан, поэтому вы можете удалить дубликат из конфигурации Spring.

Вы также можете добавить точки останова, где устанавливаются свойства соединения кролика.

«время подключения истекло» также появляется, когда данный IP-адрес неверен.

В любом случае я бы не рекомендовал задавать свойства в скрипте сборки, вместо этого указывать файлы свойств в командной строке при запуске приложения. Это позволяет использовать вашу сборку в разных средах.

См. howto-properties-and- конфигурация

Почему он бросает во время сборки jar? Вы написали, что устанавливаете свойства с помощью скрипта во время сборки.

Это означает, что тесты используют эти свойства, и теперь тесты терпят неудачу, возможно, из-за того, что сервер rabbit mq недоступен с предоставленными свойствами или не работает.

Пока вы переопределяете bean-компоненты, вы на самом деле не знаете, какой экземпляр вы используете, поэтому вы действительно не знаете, какие свойства вы используете. Попробуйте выйти из него, чем я уверен, вы увидите ....

person Stefan Isele - prefabware.com    schedule 01.07.2016
comment
Спасибо за ваш ответ. Я не хочу, чтобы несколько bean-компонентов автоматически предоставлялись spring-rabbit.ex) connectionFactory, ListernerContainerFactory. Поэтому я вручную настроил эти bean-компоненты в соответствии со своими требованиями. Таким образом, информационное сообщение является действительным, но почему оно выбрасывается при создании jar? - person VelNaga; 01.07.2016

Вы не можете «лениво загружать» bean-компоненты, которые реализуют SmartLifecycle (например, контейнер прослушивателя), потому что контекст должен загрузить bean-компонент для вызова isAutoStartup(), чтобы увидеть, следует ли запускать bean-компонент.

Если контекст загружается во время «сборки jar», у вас должны быть тестовые примеры, использующие bean-компоненты. Вы можете установить autoStartup в false, но тогда ваши тесты, вероятно, не пройдут.

Вы можете пропустить запуск тестов с помощью -DskipTests=true (maven) или -x test (gradle).

person Gary Russell    schedule 03.07.2016

У меня такая же проблема в тестах. Я не использую кролика, и из-за тайм-аутов продолжительность тестов увеличивается.

В качестве простого обходного пути вы можете отключить настройку очередей, обменов и т. д. во время тестов с использованием профилей 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 {
     ...
}

Недостатком этого подхода является то, что вы должны добавлять профиль в каждый тест, в котором не используется кролик. Но для моего случая это нормально, пока у меня нет лучшего решения.

person stefku    schedule 06.01.2017