ActiveMQ DefaultMessageListenerContainer为什么只有一个连接?

时间:2018-12-26 04:15:33

标签: spring spring-mvc activemq

<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
  <property name="brokerURL" value="${mq.activemq.host}" />
  <property name="userName" value="${mq.activemq.user}" />
  <property name="password" value="${mq.activemq.pass}" />
  <property name="maxThreadPoolSize" value="30" />
</bean>
<bean id="amqPooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
  <property name="connectionFactory" ref="amqConnectionFactory" />
  <property name="maxConnections" value="10" />
  <property name="maximumActiveSessionPerConnection" value="300" />
  <property name="idleTimeout" value="60000" />
</bean>
<bean id="queueListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="amqPooledConnectionFactory" />
    <property name="destination" ref="queueDestination" />
    <property name="messageListener" ref="queueAwareMessageListener" />
    <property name="taskExecutor" ref="queueListenerTaskExecutor" />
    <property name="concurrency" value="5-30" />
</bean>

maxThreadPoolSizemaxConnectionsmaximumActiveSessionPerConnectionconcurrency之间是什么关系?

为什么我将maxConnections设置为10,但是侦听器在连接中仅一个连接器,不能增加更多?

消费者人数是正确的。初始化时有5个,随着变化逐渐增加。

1 个答案:

答案 0 :(得分:0)

关于将要使用的连接数的底线由您配置的org.springframework.jms.listener.DefaultMessageListenerContainer决定(因为这是此处实际创建连接的唯一组件)。据我所知,它只会创建一个单个连接,因此在这里使用连接池显得毫无意义。 concurrency参数仅控制连接上消费者的并发数量。

通过在maxConnections上设置org.apache.activemq.pool.PooledConnectionFactory = 10,您只是在限制连接池的大小。但是,由于queueListenerContainer永远不会调用createConnection()一次以上,所以这并不重要。

您可以在the ActiveMQ documentation中了解maxThreadPoolSize中的org.apache.activemq.ActiveMQConnectionFactory