我的spring webapp(在本地码头上运行)遇到了一个奇怪的问题,它连接到本地运行的ActiveMQ代理以实现JMS功能。一旦我启动代理,应用程序就会变得异常缓慢,例如,使用活动代理启动 ApplicationContext 需要很长时间(即 > 10 分钟,还没有等待足够长的时间来完成它)。如果我在 webapp 之后(即加载 ApplicationContext 之后)启动代理,它会以非常慢的方式运行(通常需要 <1s 的请求需要 >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)
任何帮助是极大的赞赏 !