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

Tomcat Server Hanging During Startup When Using 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.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.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.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)***

我不确定如何解决这个问题。期待一些 inputs/directions 来解决这个问题。

您需要出示您的代码;你说你正在以编程方式创建容器(在 Spring 之外),但你正在通过 RabbitAdmin.

与应用程序上下文交互

你不能两全其美;要么使用上下文,要么不使用。

你需要找到哪个线程拥有这个锁

waiting to lock <0x00000007713d46b0>

您或许可以找到解决方法。

一种可能是使用单独的连接工厂(在 Spring 应用程序上下文之外创建),这样就不会调用 rabbit admin 来声明队列等。

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

但是,第一步是找出谁拥有这把锁。