2017-01-27 41 views
2

我遇到了一个我们的应用程序问题。该应用程序是一个自写的Java应用程序,它通过JMS连接到50多个不同的消息队列,并使用来自这些队列的消息。用bitronix屏蔽线程

从功能角度来看,处理来自不同队列的所有消息都可以正常工作。然而,在测试过程中,我们发现不同消息的处理速度远远不够。我们只能够每分钟处理每个队列的几条消息。

为了更好地理解正在发生的事情我已经与江铃一个flightrecording制成,看到有很多阻塞时间为从消息队列中消费消息的每个线程的:

Picture: Blocking JMS threads

旁边我在飞行记录中看到的这张图表显示,通过访问特定的WeakHashMap关闭并获取XAResource,花费了大量的时间。

Picture: Lock instances

下一步我所做的分析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定义来settup的连接:

<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" 

号码:的自动启动= “$ {FWK jms.listener.start}”/>

附加到这一个,我已经为每个消息队列和自己的类处理来自此队列的消息:

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

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

任何意见或建议都非常受欢迎。

回答

1

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

+0

根据我通过WebSphere MQ管理员监视的内容,我发现有很多**共享**连接供此应用程序使用的队列使用。此外,我用netstat监视了客户端发生了什么,并且在那里我还看到了很多到MQ服务器的传出连接。所有这些都是通过相同的端口1515.进一步的PID为所有这些是2488.有趣的是,其中约80%的连接状态是“建立”和20%是“等待”(与PID 0)。问题是我可以通过配置影响这种行为 – Tianico