Jms 使用bitronix阻塞线程

Jms 使用bitronix阻塞线程,jms,tomcat7,ibm-mq,jmc,bitronix,Jms,Tomcat7,Ibm Mq,Jmc,Bitronix,我对我们的一个应用程序有问题。该应用程序是一个自写Java应用程序,通过JMS连接到50多个不同的消息队列,并使用这些队列中的消息 从功能的角度来看,处理来自不同队列的所有消息效果良好。然而,在测试过程中,我们发现不同消息的处理速度要慢得多。我们每个队列每分钟只能处理几条消息 为了更好地理解正在发生的事情,我使用JMC制作了一个flightrecording,并发现每个使用消息队列中消息的线程都有很多阻塞时间: 在这个图表旁边,我在飞行记录中也看到,很多时间都花在访问特定的WeakHashMa

我对我们的一个应用程序有问题。该应用程序是一个自写Java应用程序,通过JMS连接到50多个不同的消息队列,并使用这些队列中的消息

从功能的角度来看,处理来自不同队列的所有消息效果良好。然而,在测试过程中,我们发现不同消息的处理速度要慢得多。我们每个队列每分钟只能处理几条消息

为了更好地理解正在发生的事情,我使用JMC制作了一个flightrecording,并发现每个使用消息队列中消息的线程都有很多阻塞时间:

在这个图表旁边,我在飞行记录中也看到,很多时间都花在访问特定的WeakHashMap来关闭、获取和使用资源上

我所做的下一步是分析JMS bitronix配置的外观。以下是相关部分:

在Tomcat服务器级别,我得到了由bitronix加载的resource.properties文件:

resource.cf1.className=com.ibm.mq.jms.MQXAQueueConnectionFactory
resource.cf1.uniqueName=jms/cf
resource.cf1.minPoolSize=1
resource.cf1.maxPoolSize=60
resource.cf1.driverProperties.hostName=genadev0059.mycompnany.com
resource.cf1.driverProperties.port=1515
resource.cf1.driverProperties.channel=APPL_CHL
resource.cf1.driverProperties.transportType=1
resource.cf1.driverProperties.queueManager=DEV
在Spring应用程序XML中,我有以下bean定义来设置连接:

<jee:jndi-lookup id="connectionFactory" jndi-name="jms/cf" resource-ref="true" proxy-interface="javax.jms.ConnectionFactory"/>

<bean id="userCredentialsConnectionFactory" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter" p:targetConnectionFactory-ref="connectionFactory" p:username="$jms{jmsuser}" p:password="$jms{jmspwd}"/>

<bean id="cachedConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory" p:sessionCacheSize="$fwk{jms.connectionFactory.sessionCacheSize}" p:targetConnectionFactory-ref="userCredentialsConnectionFactory"/> 

<bean id="parentJmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer" abstract="true" p:connectionFactory-ref="cachedConnectionFactory" p:sessionTransacted="true" p:transactionManager-ref="transactionManager"

除此之外,我还为每个消息队列和处理此队列中消息的自己的类指定了:

<bean id="messageQueueThread1" parent="parentJmsContainer">
     <property name="destinationName" value="queue1" />
     <property name="messageListener">
            <bean class="com.mycompany.service.jms.Queue1Listener" />
     </property>
</bean>

我假设错误与连接的配置方式有关。我尝试了其他不同的方法,但是阻塞线程的结果总是一样的


非常欢迎任何输入或建议。

队列管理器端有多少“实际”连接?每个线程应该使用1个连接。如果您在线程之间共享连接,那么这就是为什么您会看到阻塞。

根据我通过WebSphere MQ Administrator监控的内容,我发现此应用程序使用的队列有很多共享连接。此外,我还使用netstat监控了客户端的情况,在那里我还看到了许多到MQ服务器的传出连接。它们都经过同一个端口1515。此外,它们的PID均为2488。有趣的是,大约80%的连接状态为“已建立”,20%的连接状态为“正在等待”(PID为0)。问题是我如何通过配置影响这种行为