我的某个应用程序存在问题。该应用程序是一个自编写的Java应用程序,它通过JMS连接到50多个不同的消息队列,并消耗来自这些队列的消息。
从功能角度来看,处理来自不同队列的所有消息都可以正常工作。然而,在测试时我们发现不同消息的处理速度很慢。我们每分钟只能处理几个消息。
为了更好地了解我使用JMC进行航班记录的情况,并发现每个线程都有很多阻塞时间消耗来自消息队列的消息:
除了这张图之外,我还在飞行记录中看到,在访问特定的WeakHashMap以关闭和获取XAResource时花费了大量时间。
我所做的下一步是分析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"
号码:的自动启动=&#34; $ FWK {jms.listener.start}&#34; /&GT;
除此之外,我还为每个消息队列和自己的类处理来自此队列的消息:
<bean id="messageQueueThread1" parent="parentJmsContainer">
<property name="destinationName" value="queue1" />
<property name="messageListener">
<bean class="com.mycompany.service.jms.Queue1Listener" />
</property>
</bean>
我认为错误与连接的配置方式有关。我尝试了不同的其他方法,但阻塞线程的结果总是相同的。
非常欢迎任何意见或建议。
答案 0 :(得分:1)
多少&#34;实际&#34;队列管理器端有连接吗?您应该为每个线程使用1个连接。如果您在线程之间共享连接,那么这就是您看到阻塞的原因。