Activemq代理运行时Web App挂起

时间:2015-01-27 07:36:32

标签: spring jms activemq maven-jetty-plugin jstack

我的spring webapp(在本地jetty上运行)出现了一个奇怪的问题,它连接到本地运行的ActiveMQ代理以获取JMS功能。 一旦我启动代理,应用程序变得异常缓慢,例如带有活动代理的ApplicationContext的启动需要永远(即> 10分钟,还没有等待足够长的时间才能完成)。如果我在webapp之后启动代理(即在加载ApplicationContext之后),它正以非常慢的方式运行(请求通常需要< 1s取> 30s)。即使没有涉及JMS的操作,所有操作也需要更长时间。当我在没有activemq代理的情况下运行应用程序时,一切运行顺利(当然除了JMS相关的东西;-))

这是我到目前为止所尝试的内容:

  1. 将ActiveMQ版本更新为5.10.1
  2. 使用独立的ActiveMQ而不是maven-plugin
  3. 将代理从单独的JVM(通过活动的mq maven插件,通过jetty配置中的JNDI查找连接)移动到同一个JVM(通过spring config启动,没有JNDI)
  4. 将活动的mq传输从tcp更改为vm
  5. 几个activemq设置(alwaysSyncSend,alwaysSessionAsync,producerWindowSize)
  6. 使用CachingConnectionFactory和PooledConnectionFactory
  7. 在分析线程转储(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)
    

    非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我找到了问题的原因并且能够修复它: 我们将一个transactionmanager传递给AbstractMessageListenerContainer。在生产中,在本地jetty环境中使用的XA-Transactionmanager仅使用JPATransactionManager。显然,JMS正在等待提交的XA事务,这在本地环境中永远不会发生。 通过覆盖本地环境的AbstractMessageListenerContainer的bean定义而不设置transcationmanager但使用sessionTransacted="true"代替一切正常。 我认为它可能与启用ActiveMQ日志记录的事务处理有关。有了这个,我发现交易有问题(transactionContext.getTransactionId()返回null)。