【发布时间】:2015-03-25 18:27:09
【问题描述】:
我的 spring webapp(在本地码头上运行)遇到了一个奇怪的问题,它连接到本地运行的 ActiveMQ 代理以实现 JMS 功能。 一旦我启动代理,应用程序就会变得异常缓慢,例如使用活动代理启动 ApplicationContext 需要很长时间(即 > 10 分钟,还没有等待足够长的时间来完成)。如果我在 webapp 之后(即加载 ApplicationContext 之后)启动代理,它会以非常非常缓慢的方式运行(通常需要 30s)。即使不涉及 JMS,所有操作也需要更长的时间。当我在没有 activemq 代理的情况下运行应用程序时,一切都运行顺利(当然 JMS 相关的东西除外 ;-))
到目前为止,这是我尝试过的:
- 将 ActiveMQ 版本更新为 5.10.1
- 使用独立的 ActiveMQ 而不是 maven-plugin
- 将运行从单独 JVM 的代理(通过活动 mq maven 插件,通过 jetty 配置中的 JNDI 查找连接)移动到同一个 JVM(通过 spring 配置启动,没有 JNDI)
- 将活动 mq 传输从 tcp 更改为 vm
- 几个 activemq 设置(alwaysSyncSend、alwaysSessionAsync、producerWindowSize)
- 使用 CachingConnectionFactory 和 PooledConnectionFactory
在分析线程转储 (jstack) 时,我看到许多 activemq 线程在监视器上休眠。看起来像这样:
"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)
非常感谢任何帮助!
【问题讨论】:
标签: spring jms activemq maven-jetty-plugin jstack