Spring 当活动MQ代理正在运行时,Webapp挂起
我在本地jetty上运行的SpringWebApp遇到了一个奇怪的问题,它连接到本地运行的ActiveMQ代理以实现JMS功能。 一旦启动代理,应用程序就会变得异常缓慢,例如,使用active broker启动ApplicationContext需要花费很长时间,即>10分钟,但尚未等待足够长的时间才能完成。如果我在webapp之后启动代理,即在加载ApplicationContext之后,它正在运行,但运行速度非常慢,请求通常需要30秒。所有操作都需要更长的时间,即使是那些没有涉及JMS的操作。当我在没有activemq代理的情况下运行应用程序时,除了与JMS相关的东西之外,其他一切都会顺利运行;- 以下是我迄今为止所做的尝试: 将ActiveMQ版本更新为5.10.1 使用独立ActiveMQ代替maven插件 将代理通过活动mq maven插件从单独的JVM运行,通过jetty配置中的JNDI查找连接到通过spring配置启动的同一JVM中,而不使用JNDI 将活动mq传输从tcp更改为vm 多个activemq设置alwaysSyncSend、alwaysSessionAsync、producerWindowSize 使用CachingConnectionFactory和PooledConnectionFactory 在分析线程转储jstack时,我看到许多activemq线程睡在监视器上。看起来是这样的:Spring 当活动MQ代理正在运行时,Webapp挂起,spring,jms,activemq,maven-jetty-plugin,jstack,Spring,Jms,Activemq,Maven Jetty Plugin,Jstack,我在本地jetty上运行的SpringWebApp遇到了一个奇怪的问题,它连接到本地运行的ActiveMQ代理以实现JMS功能。 一旦启动代理,应用程序就会变得异常缓慢,例如,使用active broker启动ApplicationContext需要花费很长时间,即>10分钟,但尚未等待足够长的时间才能完成。如果我在webapp之后启动代理,即在加载ApplicationContext之后,它正在运行,但运行速度非常慢,请求通常需要30秒。所有操作都需要更长的时间,即使是那些没有涉及JMS的操作
"ActiveMQ VMTransport: vm://localhost#0-3" daemon prio=6 tid=0x000000000b1a3000 nid=0x1840 waiting on condition [0x00000000177df000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000f786d670> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:196)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:424)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:323)
at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:874)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:955)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:917)
at java.lang.Thread.run(Thread.java:662)
非常感谢您的帮助 我找到了问题的原因并得以解决: 我们正在将transactionmanager传递给AbstractMessageListenerContainer。在生产环境中,在本地jetty环境中使用XA Transactionmanager时,仅使用JPATransactionManager。显然,JMS永远在等待提交XA事务,这在本地环境中是不可能发生的。 通过覆盖本地env的AbstractMessageListenerContainer的bean定义,而不设置TransactionManager,而是使用sessionTransacted=true,一切正常。 通过启用ActiveMQ日志记录,我认为这可能与事务处理有关。这样,我发现事务transactionContext.getTransactionId返回null时出现了问题