jms - 使用 bitronix 阻塞线程

标签 jms tomcat7 ibm-mq jmc bitronix

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

从功能的角度来看,来自不同队列的所有消息的处理工作正常。然而,在测试时我们发现不同消息的处理速度非常慢。我们每分钟只能处理每个队列的几条消息。

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

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 定义来设置连接:

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

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

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

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

我们非常欢迎任何意见或建议。

最佳答案

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

关于jms - 使用 bitronix 阻塞线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41894849/

相关文章:

java - 为 MessageListener 调用 stop() 并暂时暂停连接传入消息的传递的正确位置。(JMSCC0012..)?

jakarta-ee - JAAS 身份验证在 JMS 中使用 WildFly : javax. jms.JMSSecurityException:HQ119032:用户:null 没有权限 = 在地址 {2} 上发送

Azure ServiceBus JMS 事务支持尚不清楚

Spring tx :annotation-driven works in eclipse, 但不在 tomcat 中

java - 如何在 SourceTransferEndExit 将 msg 放入 MQ

WebSphere MQ 连接调整

java - Java EE 应用程序的可扩展性。你会如何处理它?

java - 读取 Jetty 请求正文会导致 IndexOutOfBoundsException

java - Openshift 上 Tomcat 7.0.39 上的 Websocket

c# - 在 .NET WMQ API 中接收 WebSphere MQ 消息有时会抛出 MQRC_RFH_FORMAT_ERROR