Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 当活动MQ代理正在运行时,Webapp挂起_Spring_Jms_Activemq_Maven Jetty Plugin_Jstack - Fatal编程技术网

Spring 当活动MQ代理正在运行时,Webapp挂起

Spring 当活动MQ代理正在运行时,Webapp挂起,spring,jms,activemq,maven-jetty-plugin,jstack,Spring,Jms,Activemq,Maven Jetty Plugin,Jstack,我在本地jetty上运行的SpringWebApp遇到了一个奇怪的问题,它连接到本地运行的ActiveMQ代理以实现JMS功能。 一旦启动代理,应用程序就会变得异常缓慢,例如,使用active broker启动ApplicationContext需要花费很长时间,即>10分钟,但尚未等待足够长的时间才能完成。如果我在webapp之后启动代理,即在加载ApplicationContext之后,它正在运行,但运行速度非常慢,请求通常需要30秒。所有操作都需要更长的时间,即使是那些没有涉及JMS的操作

我在本地jetty上运行的SpringWebApp遇到了一个奇怪的问题,它连接到本地运行的ActiveMQ代理以实现JMS功能。 一旦启动代理,应用程序就会变得异常缓慢,例如,使用active broker启动ApplicationContext需要花费很长时间,即>10分钟,但尚未等待足够长的时间才能完成。如果我在webapp之后启动代理,即在加载ApplicationContext之后,它正在运行,但运行速度非常慢,请求通常需要30秒。所有操作都需要更长的时间,即使是那些没有涉及JMS的操作。当我在没有activemq代理的情况下运行应用程序时,除了与JMS相关的东西之外,其他一切都会顺利运行;-

以下是我迄今为止所做的尝试:

将ActiveMQ版本更新为5.10.1 使用独立ActiveMQ代替maven插件 将代理通过活动mq maven插件从单独的JVM运行,通过jetty配置中的JNDI查找连接到通过spring配置启动的同一JVM中,而不使用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)

非常感谢您的帮助

我找到了问题的原因并得以解决: 我们正在将transactionmanager传递给AbstractMessageListenerContainer。在生产环境中,在本地jetty环境中使用XA Transactionmanager时,仅使用JPATransactionManager。显然,JMS永远在等待提交XA事务,这在本地环境中是不可能发生的。 通过覆盖本地env的AbstractMessageListenerContainer的bean定义,而不设置TransactionManager,而是使用sessionTransacted=true,一切正常。 通过启用ActiveMQ日志记录,我认为这可能与事务处理有关。这样,我发现事务transactionContext.getTransactionId返回null时出现了问题