我的spring webapp(在本地jetty上运行)出现了一个奇怪的问题,它连接到本地运行的ActiveMQ代理以获取JMS功能。 一旦我启动代理,应用程序变得异常缓慢,例如带有活动代理的ApplicationContext的启动需要永远(即> 10分钟,还没有等待足够长的时间才能完成)。如果我在webapp之后启动代理(即在加载ApplicationContext之后),它正以非常慢的方式运行(请求通常需要< 1s取> 30s)。即使没有涉及JMS的操作,所有操作也需要更长时间。当我在没有activemq代理的情况下运行应用程序时,一切运行顺利(当然除了JMS相关的东西;-))
这是我到目前为止所尝试的内容:
在分析线程转储(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)
非常感谢任何帮助!
答案 0 :(得分:0)
我找到了问题的原因并且能够修复它:
我们将一个transactionmanager传递给AbstractMessageListenerContainer。在生产中,在本地jetty环境中使用的XA-Transactionmanager仅使用JPATransactionManager。显然,JMS正在等待提交的XA事务,这在本地环境中永远不会发生。
通过覆盖本地环境的AbstractMessageListenerContainer的bean定义而不设置transcationmanager但使用sessionTransacted="true"
代替一切正常。
我认为它可能与启用ActiveMQ日志记录的事务处理有关。有了这个,我发现交易有问题(transactionContext.getTransactionId()
返回null
)。