Сервер Tomcat зависает во время запуска при использовании Spring Rabbit

Я использую Spring Rabbit 1.5.1 в одном из своих проектов, и у меня есть некоторый пользовательский код, который создает объекты контейнера прослушивателя на лету во время запуска (не в конфигурации, а программно через bean).
Но сервер, кажется, никогда не включается и зависает навсегда.
Когда я взял дамп потока, вот что я обнаружил до сих пор.

***"SimpleAsyncTaskExecutor-1" #38 prio=5 os_prio=31 tid=0x00007f84bf220000 nid=0x8503 waiting for monitor entry [0x000000012a583000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:187)
- waiting to lock <0x00000007713d46b0> (a java.util.concurrent.ConcurrentHashMap)
at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:488)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:447)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:423)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:530)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:523)
at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1153)
at org.springframework.amqp.rabbit.core.RabbitAdmin.initialize(RabbitAdmin.java:384)
at org.springframework.amqp.rabbit.core.RabbitAdmin$11.onCreate(RabbitAdmin.java:351)
at org.springframework.amqp.rabbit.connection.CompositeConnectionListener.onCreate(CompositeConnectionListener.java:32)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:502)
- locked <0x0000000774662870> (a java.lang.Object)
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils$1.createConnection(ConnectionFactoryUtils.java:80)
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.doGetTransactionalResourceHolder(ConnectionFactoryUtils.java:130)
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.getTransactionalResourceHolder(ConnectionFactoryUtils.java:67)
at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:456)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1158)
at java.lang.Thread.run(Thread.java:745)***

вместе с еще одним ниже:

***"SimpleAsyncTaskExecutor-1" #41 prio=5 os_prio=31 tid=0x00007f84bb162800 nid=0x8b03 waiting for monitor entry [0x0000000126e73000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:498)
- waiting to lock <0x0000000774662870> (a java.lang.Object)
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils$1.createConnection(ConnectionFactoryUtils.java:80)
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.doGetTransactionalResourceHolder(ConnectionFactoryUtils.java:130)
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.getTransactionalResourceHolder(ConnectionFactoryUtils.java:67)
at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:456)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1158)
at java.lang.Thread.run(Thread.java:745)***

Я не уверен, как преодолеть эту проблему. С нетерпением жду некоторых входов/направлений, чтобы решить эту проблему.


person Karthik    schedule 11.11.2015    source источник
comment
Просто дополнительная информация, которую я заметил после того, как я включил ведение журнала отладки весной, заключалась в том, что bean-компонент был инициализирован один раз ранее, после чего все это начинается сначала, когда возникла эта проблема.   -  person Karthik    schedule 11.11.2015


Ответы (1)


Вам нужно показать свой код; вы говорите, что создаете контейнеры программно (вне Spring), но взаимодействуете с контекстом приложения через RabbitAdmin.

У вас не может быть и того, и другого; либо используйте контекст, либо нет.

Вам нужно найти, какой поток владеет этой блокировкой

waiting to lock <0x00000007713d46b0>

и, возможно, вы сможете найти обходной путь.

Одной из возможностей было бы использование отдельной фабрики соединений (созданной вне контекста приложения Spring), чтобы администратор кролика не вызывался для объявления очередей и т. д.

Другой способ может заключаться в том, чтобы отключить автоматическое объявление RabbitAdmin, установив для autoStartup значение false.

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

person Gary Russell    schedule 11.11.2015
comment
Спасибо за ваш комментарий Гэри. Я пытался создать пример кода, чтобы показать это поведение, но не смог! Я не могу показать код, который я пишу (он не общедоступен), и я надеюсь, что вы понимаете. Я понимаю необходимость иметь здесь фрагмент кода. Тем не менее, ваше предложение сработало для меня, когда я создал другую фабрику соединений. Я приму это как ответ, как только закончу несколько тестов. Еще раз спасибо. - person Karthik; 12.11.2015