2014-01-26 19 views
0

我遇到了一個奇怪的問題。 當我用spring xml配置DataSourceTransactionManager時,無論我更改「maxConcurrentConsumers」屬性值,ActiveMQ的併發使用者都被壓制。我有5個隊列,所有5個隊列的總併發消費者總是保持在8.爲什麼Spring DataSourceTransactionManager壓制ActiveMQ使用者的併發數

如果我刪除了DataSourceTransactionManager bean,則每個隊列的併發消費者都達到了「maxConcurrentConsumers」中聲明的最大值5。

DataSourceTransactionManager適用於dataSource,我無法理解爲什麼它影響到ActiveMQ。

版本:

  • 春3.2.5.RELEASE
  • 的ActiveMQ 5.9.0

的application.xml

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${jdbc.driver}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.user}" /> 
    <property name="password" value="${jdbc.password}" /> 
</bean> 

<!-- once I add this, activemq total consumers always kept at 8 --> 
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<!-- activemq consumer connection --> 
<bean id="consumerConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" 
    destroy-method="stop"> 
    <property name="connectionFactory"> 
     <bean class="org.apache.activemq.ActiveMQConnectionFactory"> 
      <property name="brokerURL"> 
       <value>tcp://localhost:61616</value> 
      </property> 
     </bean> 
    </property> 
    <property name="maxConnections" value="5"></property> 
</bean> 

<!-- i have 5 queues --> 
<bean id="test_1" class="org.apache.activemq.command.ActiveMQQueue"> 
    <constructor-arg index="0" value="test_1}" /> 
</bean> 
<bean id="test_2" class="org.apache.activemq.command.ActiveMQQueue"> 
    <constructor-arg index="0" value="test_2}" /> 
</bean> 
<bean id="test_3" class="org.apache.activemq.command.ActiveMQQueue"> 
    <constructor-arg index="0" value="test_3}" /> 
</bean> 
<bean id="test_4" class="org.apache.activemq.command.ActiveMQQueue"> 
    <constructor-arg index="0" value="test_4}" /> 
</bean> 
<bean id="test_5" class="org.apache.activemq.command.ActiveMQQueue"> 
    <constructor-arg index="0" value="test_5}" /> 
</bean> 

<!-- consumer listener container --> 
<bean id="testOneMessageListenerContainer" 
    class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="consumerConnectionFactory"></property> 
    <property name="concurrentConsumers" value="1" /> 
    <property name="maxConcurrentConsumers" value="5" /> 
    <property name="destination" ref="test_1"></property> 
    <property name="messageListener" ref="demoBusinessListener"></property> 
</bean> 

<bean id="testTwoMessageListenerContainer" 
    class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="consumerConnectionFactory"></property> 
    <property name="concurrentConsumers" value="1" /> 
    <property name="maxConcurrentConsumers" value="5" /> 
    <property name="destination" ref="test_2"></property> 
    <property name="messageListener" ref="demoBusinessListener"></property> 
</bean> 

<bean id="testThreeMessageListenerContainer" 
    class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="consumerConnectionFactory"></property> 
    <property name="concurrentConsumers" value="1" /> 
    <property name="maxConcurrentConsumers" value="5" /> 
    <property name="destination" ref="test_3"></property> 
    <property name="messageListener" ref="demoBusinessListener"></property> 
</bean> 

<bean id="testFourMessageListenerContainer" 
    class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="consumerConnectionFactory"></property> 
    <property name="concurrentConsumers" value="1" /> 
    <property name="maxConcurrentConsumers" value="5" /> 
    <property name="destination" ref="test_4"></property> 
    <property name="messageListener" ref="demoBusinessListener"></property> 
</bean> 

<bean id="testFiveMessageListenerContainer" 
    class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="consumerConnectionFactory"></property> 
    <property name="concurrentConsumers" value="1" /> 
    <property name="maxConcurrentConsumers" value="5" /> 
    <property name="destination" ref="test_5"></property> 
    <property name="messageListener" ref="demoBusinessListener"></property> 
</bean> 

有人可以幫助我!

回答

0

經過一番測試,我找到了解決這個問題的方法。 當我將dataSource「maxActive」參數更改爲大於所有mq偵聽器maxConcurrentConsumers的總和的數字。它工作正常。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${jdbc.driver}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.user}" /> 
    <property name="password" value="${jdbc.password}" /> 
    <property name="maxActive" value="120" /> 
</bean> 

似乎受到數據源maxActive參數

+0

ActiveMQ的監聽線程的最大數量這迷惑了不少。任何未來的調查? – Vance

相關問題