【问题标题】:Webapp hangs when Active MQ broker is running当 Activemq 代理运行时,Web 应用程序挂起
【发布时间】:2015-03-25 18:27:09
【问题描述】:

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

到目前为止,这是我尝试过的:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多