首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用bitronix阻塞线程

使用bitronix阻塞线程
EN

Stack Overflow用户
提问于 2017-01-27 21:15:42
回答 1查看 128关注 0票数 2

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

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

为了更好地理解发生了什么,我用JMC做了一次飞行记录,发现每个线程消耗消息队列中的消息都有大量的阻塞时间:

Picture: Blocking JMS threads

除了这张图,我还在飞行记录中看到,很多时间都花在访问特定的WeakHashMap to close和get和XAResource上。

Picture: Lock instances

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

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

代码语言:javascript
复制
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定义来设置连接:

代码语言:javascript
复制
<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"

p:autoStartup="$fwk{jms.listener.start}"/>

除了这个之外,我还为每个消息队列和自己的类处理来自该队列的消息:

代码语言:javascript
复制
<bean id="messageQueueThread1" parent="parentJmsContainer">
     <property name="destinationName" value="queue1" />
     <property name="messageListener">
            <bean class="com.mycompany.service.jms.Queue1Listener" />
     </property>
</bean>

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

欢迎任何意见或建议。

EN

回答 1

Stack Overflow用户

发布于 2017-01-28 01:16:11

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41894849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档