使用Spring Rabbit时启动期间Tomcat服务器挂起

时间:2015-11-11 09:10:49

标签: spring rabbitmq spring-amqp 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)***

我不知道如何克服这个问题。期待一些输入/方向来解决这个问题。

1 个答案:

答案 0 :(得分:1)

您需要显示您的代码;你说你是以编程方式创建容器的(在Spring之外),但是你通过RabbitAdmin与应用程序上下文进行交互。

你不能双管齐下;要么使用上下文,要么不使用。

您需要找到拥有此锁的哪个主题

waiting to lock <0x00000007713d46b0>

你可能能够找到解决方法。

一种可能性是使用单独的连接工厂(在Spring应用程序上下文之外创建),因此不会调用兔子管理员来声明队列等。

另一种方法可能是通过将RabbitAdmin设置为false来禁用autoStartup自动声明。

但是,第一步是找出谁拥有那个锁。