2011-04-27 34 views
0

我有一個使用DefaultMessageListenerContainer設置具有以下配置:的ActiveMQ +彈簧+使用DefaultMessageListenerContainer - 極差表現

threadServiceListenerContainer(org.springframework.jms.listener.DefaultMessageListenerContainer) { 
     maxConcurrentConsumers = 10 
     concurrentConsumers = 1 
     destinationName = 'releaseThread' 
     pubSubDomain = false 
     connectionFactory = ref("connectionFactory") 
     messageListener = ref('threadServiceMessageListener') 
    } 

有3000個坐在經紀人積壓消息。消費率似乎是2 /秒。我已經將JProfiler附加到了Java節點上,但似乎10個監聽器線程/消費者在最壞情況下處於空閒狀態,或者最多隻能一次運行。

消費者處理時間沒有註冊到JProfiler。消費者只是爲memcached添加一個值,而memcached正在健康運行。

看來,我的消費只是......坐在那裏......

有什麼想法?我重新啓動了代理,沒有性能差異。我重新啓動了節點,沒有性能差異。

我正在向經紀人注入地圖。

這裏是我的ConnectionFactory豆:

connectionFactory(org.springframework.jms.connection.CachingConnectionFactory, ref("amqConnectionFactory")) { 
     exceptionListener = {com.zipwhip.jms.JmsExceptionListener jmsExceptionListener -> } 
     sessionCacheSize = 100 
    } 
    amqConnectionFactory(org.apache.activemq.ActiveMQConnectionFactory) { 
     brokerURL = 'tcp://localhost:61616' 
    } 
+0

您使用的是什麼版本的AMQ?這聽起來像這個問題已修復在5.4,https://issues.apache.org/jira/browse/AMQ-2754 – 2012-03-01 05:41:43

回答

0

我建議你嘗試幾件事情:設置生產流程控制,以虛假和改變調度策略。嘗試改變其中之一或兩者,看看它是否有幫助。我們在ActiveMQ方面遇到了性能問題(運行嵌入式OpenEJB),但最終使所有的部分都順利運行。

要更改這些使用activemq.xml中使用這樣的:

<destinationPolicy> 
      <policyMap> 
       <policyEntries> 
        <policyEntry queue=">" producerFlowControl="false" enableAudit="false" > 
         <dispatchPolicy> 
          <roundRobinDispatchPolicy /> 
         </dispatchPolicy> 
        </policyEntry> 
       </policyEntries> 
      </policyMap> 
</destinationPolicy> 

此外,我們從ActiveMQ的4.x版升級到5.3.1,我們從JDBC /日誌持久切換到KahaDB持久性。

+0

我實際上擔心我可能試圖通過1連接漏斗過多的流量。你們是否使用CachingConnectionFactory?你有多個基礎連接? – 2011-04-27 06:07:38

+0

我們有單一的生產者和多個消費者(通常)。不過,我們使用J2EE - 而不是Spring。發送到activeMQ時我們做的一件事是將useAsyncSend設置爲true。隊列連接工廠是我們從ActiveMQ(通過openejb)獲得的默認連接工廠。 – topchef 2011-04-27 16:50:55