2017-01-27 45 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