为什么Spring DataSourceTransactionManager会抑制ActiveMQ使用者的并发数量

时间:2014-01-26 02:18:25

标签: spring concurrency activemq

我遇到了一个奇怪的问题。 当我使用spring xml配置DataSourceTransactionManager时,无论我更改“maxConcurrentConsumers”属性值,都会抑制ActiveMQ的并发使用者。我有5个队列,所有5个队列的总并发消费者总是保持在8。

如果我删除DataSourceTransactionManager bean,则每个队列的并发使用者达到“maxConcurrentConsumers”中声明的最大数量5。

DataSourceTransactionManager适用于dataSource,我无法理解为什么它会影响到ActiveMQ。

版本:

  • Spring 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>

有人可以帮助我!!!

1 个答案:

答案 0 :(得分: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>

似乎受Datasource maxActive参数

影响的activemq侦听器线程的最大数量