2016-07-01 3 views
0

Почему RabbitMQ запускается или запускается при сборке jar. При запуске Application.java или pom.xml.Spring-Boot отключить запуск при загрузке rabbitMQ

я могу видеть следующие регистраторы

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[email protected]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 [[email protected]dc36e5] 
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

Свойства хоста RabbitMQ определены в application.properties, в то время как мы создаем приложение, мы будем динамически передавать эти свойства с помощью скрипта сборки. при построении банки на этапе тестирования он выбрасывает нижеследующее исключение. org.springframework.amqp.AmqpIOException: java.net.SocketTimeoutException: connect timed out – VelNaga

+0

@Gary Russell при создании банки Spring-boot попытался установить соединение RabbitMQ. В любом случае, это можно сделать с помощью ленивой загрузки? -Измените не при запуске? Также я попытался с помощью следующей аннотации @EnableAutoConfiguration (exclude = RabbitAutoConfiguration.class), но не повезло. Нам нужна ленивая загрузка SimpleMessageListenerContainer. Какие-нибудь возможности ленивой загрузки соединения RabbitMQ или SimpleMessageListenerContainer? – VelNaga

ответ

0

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

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

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

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

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

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

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

См howto-properties-and-configuration

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

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

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

+0

Благодарим вас за ответ. Я не хочу, чтобы несколько beans автоматически предоставлялось spring-rabbit.ex) connectionFactory, ListernerContainerFactory.So я вручную настроил эти bean-компоненты на основе моих требований. Так информационное сообщение является допустимым, но почему оно бросает при построении jar? – VelNaga

0

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

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

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

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 { 
    ... 
} 

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

Смежные вопросы